树莓派Qt——托盘显示CPU温度(2)

本文参考了以下文章:


在上一篇博文中实现了显示托盘图标以及查询树莓派CPU温度的功能。因此,我们还需要将这两个功能结合起来,在托盘显示CPU温度,并通过定时器不断刷新。文章的最后,我们为这个小工具设置在Raspbian系统中开机启动,使用起来更加方便。

在托盘图标上绘制温度数值

我们要在托盘图标上显示数值,首先要根据托盘图标的尺寸,为温度数值设置合适的字体与大小。这部分代码比较简单。

dialog.h
首先引入字体类的头文件:

#include <QFont>

然后定义字体对象:

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 <QPainter>

然后定义绘图工具对象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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值