本文参考了以下文章:
在上一篇博文中实现了显示托盘图标以及查询树莓派CPU温度的功能。因此,我们还需要将这两个功能结合起来,在托盘显示CPU温度,并通过定时器不断刷新。文章的最后,我们为这个小工具设置在Raspbian系统中开机启动,使用起来更加方便。
我们要在托盘图标上显示数值,首先要根据托盘图标的尺寸,为温度数值设置合适的字体与大小。这部分代码比较简单。
dialog.h
首先引入字体类的头文件:
#include
然后定义字体对象:
private:
QFont font;
dialog.cpp
然后在cpp文件的构造函数中,对字体对象font进行设置:
font.setFamily("Roboto");
font.setPointSize(30);
font.setBold(true);
这段代码设置了字体、大小以及加粗,是以我的树莓派为例的。实际可以根据自己的情况进行设置。
下面是最重要的部分。我们要以托盘图标为画布,将查询到的CPU温度绘制上去。这个过程用到了Qt的一个机制:双缓冲绘图。
双缓冲绘图是指,绘图时先将所有内容都绘制到一个绘图设备(如QPixmap)上,然后再将整个图像绘制到部件上显示出来。这种方式可以避免显示时的闪烁现象。详细内容可参考霍亚飞著《Qt Creator快速入门》(第二版)10.4节。
在上一篇博文中,我们分别定义了系统托盘对象icon,托盘图片对象image,意义就在于此。双缓冲绘图在这个工具的运用方式是这样的:我们在每一次执行update()槽时,以image图像为画布,将CPU的温度数值绘制上去,然后在托盘对象icon上进行显示。下面是详细代码。
dialog.h
首先引入绘图工具类QPainter的头文件:
#include
然后定义绘图工具对象painter:
private:
QPainter *painter;
dialog.cpp
在构造函数中对painter对象进行初始化:
painter = new Qpainter();
之后是最重要的绘图部分。我们需要通过定时器的计时,不断刷新托盘图标的显示,因此将以下代码加入update()的函数体中:
if (!temp->open(QIODevice::ReadOnly | QIODevice::Text)) //打开CPU温度文件。
{
qDebug()<<"读取文件失败";
qApp->exit();
}
else
{
QTextStream stream(temp);
QString string = stream.readAll(); //读取温度。
temp->close(); //关闭文件。
long s = string.toLong() / 1000; //转换成长整形的,以摄氏度为单位的数值。
//双缓冲绘图。
QPixmap base = image;
QString text = QString::number(s);
painter->begin(&base);
painter->setFont(font);
painter->drawText(30,62, text); //进行绘制,其中的坐标点根据树莓派显示的效果调整。
painter->end();
icon->setIcon(QIcon(base)); //将绘制完成的图像显示到托盘图标上。
}
以上的代码与上一篇博文的测试代码类似,就是加入了双缓冲绘图的内容。现在可以运行一下,效果如下:
每隔3秒(代码中定时器设置为3秒),图标上的数字都会进行刷新。
树莓派中,不同的程序有不同的形式,例如终端程序、图形界面程序等,也是由不同的语言写成的,例如python、C/C++等。因此设置开机启动的方法也有多种。具体内容可参考博文开头的链接,本文仅介绍如何设置图形界面程序的开机启动。
简单介绍下原理。Raspbian系统加载图形界面的时候,会遍历/home/pi/.config/autostart文件夹下的所有desktop文件,并将这些文件中指定的应用程序一一打开。因此我们只须在这个目录下新建desktop文件并编辑好即可,具体步骤如下。
首先在终端输入命令进入autostart文件夹:
cd /home/.config/autostart
然后新建一个desktop文件(此处以cpu为例):
sudo nano cpu.desktop
此时终端进入了文本编辑器,输入以下内容:
[Desktop Entry]
Type=Application
Name=cpu
Exec=/home/pi/project/build-cpu-unknown-Release/cpu
其中Name的值用于为当前desktop文件命名,可随意填写,最重要的部分是Type和Exec。Type值必须为Application,Exec指的是要开机启动的程序的路径。注意,此处必须是绝对路径,而且写到可执行程序为止,比如示例中我的可执行程序名为cpu。输入完毕后,按ctrl+o保存,ctrl+x退出编辑器。
为了查看效果,我们重启树莓派。在终端输入命令:
reboot
此时你发现,重启后的系统托盘处,并没有出现我们的程序图标。别着急,往下看。
在linux系统中,图形界面向来不是标配。为了节省系统资源,很多linux用户选择在终端下工作。树莓派的Raspbian系统基于debian,也存在这个情况,加之树莓派性能羸弱,加载图形界面的速度之慢更加明显。我们的小工具设置了开机启动,虽然已经在开机后第一时间运行,但是图形界面的托盘尚未加载完毕,因此程序的托盘显示失败。
我们需要对程序进行修改,主要思路是不在第一时间显示,而是不断的检测系统的托盘是否可用,确认可用后再进行显示。具体代码如下。
dialog.cpp
非常重要的一点,删除构造函数中显示托盘的代码。因为此时系统的托盘还不可用,会导致显示失败。将下面这行删除:
icon->show(); //显示托盘图标
之后修改update()槽函数,全部代码如下:
if (this->icon->isVisible()) //托盘图标已经显示,就进行绘制操作。
{
if (!temp->open(QIODevice::ReadOnly | QIODevice::Text)) //打开CPU温度文件。
{
qDebug()<<"读取文件失败";
qApp->exit();
}
else
{
QTextStream stream(temp);
QString string = stream.readAll(); //读取温度。
temp->close(); //关闭文件。
long s = string.toLong() / 1000; //转换成长整形的,以摄氏度为单位的数值。
//双缓冲绘图。
QPixmap base = image;
QString text = QString::number(s);
painter->begin(&base);
painter->setFont(font);
painter->drawText(30,62, text); //进行绘制,其中的坐标点根据树莓派显示的效果调整。
painter->end();
icon->setIcon(QIcon(base)); //将绘制完成的图像显示到托盘图标上。
}
}
else //托盘图标不可见,说明需要显示。
{
//如果系统托盘图标可用。
if (this->icon->isSystemTrayAvailable())
this->icon->show(); //进行显示。
}
至此,程序编写完毕,可以重启树莓派查看效果。
工具的代码及可执行程序下载地址:
http://download.csdn.net/detail/u012952807/9825067