Qt 数据服务器、协议转换、系统托盘模块、CAN总线模块、反射内存卡模块

网友投稿 477 2022-05-28

简单介绍

这个程序也不怎么复杂,就则一个界面,核心功能呢就是提供反射内存卡和CAN采集卡数据交互,其他的没有了。

今天主要是实现了这个程序启动以后最小化到系统托盘,在系统托盘的图标上面加上显示主界面选线和退出选项,如下图:

第一版本

首先需要包含的头文件:

#include //操作系统托盘操作类

#include

#include

Qt 数据服务器、协议转换、系统托盘模块、CAN总线模块、反射内存卡模块

需要定义的变量:

QSystemTrayIcon *m_trayIcon = nullptr; //系统托盘类

QMenu *m_trayIconMenu = nullptr; //系统托盘菜单

QAction *m_showWindowAction = nullptr;

QAction *m_exitAppAction = nullptr;

实现:

/*

* 设置系统托盘内容

*/

m_trayIcon = new QSystemTrayIcon(this);

m_trayIcon->setIcon(QIcon(":/Images/logo.ico"));

m_trayIcon->setToolTip("DateServer");

m_trayIcon->show();

/*

* 创建两个Action

*/

m_showWindowAction = new QAction(QIcon(":/Images/logo.ico"),"显示界面",this);

connect(m_showWindowAction,&QAction::triggered,this,[=](){

this->show();

});

m_exitAppAction = new QAction(QIcon(":/Images/exit.ico"),"退出程序",this);

connect(m_exitAppAction,&QAction::triggered,this,[=](){

this->close();

});

/*

* 创建菜单

*/

m_trayIconMenu = new QMenu(this);

m_trayIconMenu->addAction(m_showWindowAction);

m_trayIconMenu->addSeparator();

m_trayIconMenu->addAction(m_exitAppAction);

m_trayIcon->setContextMenu(m_trayIconMenu);

connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){

switch (temp) {

case QSystemTrayIcon::Trigger:

{

//单击图标时间

break;

}

case QSystemTrayIcon::DoubleClick:

{

if(this->isHidden())

{

this->show();

}

else

{

this->hide();

}

break;

}

}

});

这么写是没有问题的,功能全部可以实现,但是你,这样写现实我没有水平呀,所有内容都放在了构造函数里面,显得我的构造函数有点太长了,在加上我的这智商,只有一个函数不能同时现实出来,那就理解有困难呀,所以,还是给他们分分家比较好。

第二版本:

头文件新增内容:

void initMySystemTrayIcon();

void initMySystemTrayIconAction();

void initMySystemTrayIconMenu();

新增3个函数声明,分别用来初始化系统托盘、创建操作时间Action和创建菜单。

源文件实现:

void MainWindow::initMySystemTrayIcon()

{

/*

* 设置系统托盘内容

*/

m_trayIcon = new QSystemTrayIcon(this);

m_trayIcon->setIcon(QIcon(":/Images/logo.ico"));

m_trayIcon->setToolTip("DateServer");

m_trayIcon->show();

connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){

switch (temp) {

case QSystemTrayIcon::Trigger:

{

//单击图标时间

break;

}

case QSystemTrayIcon::DoubleClick:

{

if(this->isHidden())

{

this->show();

}

else

{

this->hide();

}

break;

}

}

});

initMySystemTrayIconAction();

initMySystemTrayIconMenu();

m_trayIcon->showMessage("Tip","DataServer is running",QSystemTrayIcon::Information,5000);

}

void MainWindow::initMySystemTrayIconAction()

{

/*

* 创建两个Action

*/

m_showWindowAction = new QAction(QIcon(":/Images/logo.ico"),"显示界面",this);

connect(m_showWindowAction,&QAction::triggered,this,[=](){

this->show();

});

m_exitAppAction = new QAction(QIcon(":/Images/exit.ico"),"退出程序",this);

connect(m_exitAppAction,&QAction::triggered,this,[=](){

this->close();

});

}

void MainWindow::initMySystemTrayIconMenu()

{

/*

* 创建菜单

*/

m_trayIconMenu = new QMenu(this);

m_trayIconMenu->addAction(m_showWindowAction);

m_trayIconMenu->addSeparator();

m_trayIconMenu->addAction(m_exitAppAction);

m_trayIcon->setContextMenu(m_trayIconMenu);

}

QSystemTrayIcon:

以上就是今天系统托盘的内容,今天的知识点主要就是“QSystemTrayIcon”。看下官方的描述:

“Modern operating systems usually provide a special area on the desktop, called the system tray or notification area, where long-running applications can display icons and short messages.”

大致翻译呢,就是现在操作系统通常会提在桌面上提供一个特殊的区域,我们把这个区域称为系统托盘或通知区域,长期运行的应用程序可以在这里显示图标和信息。

对这个类更详细的内容,大家可以自行百度“QSystemTrayIcon”或直接在Qt的帮助文档中查找该类即可。

解决托盘栏消息不弹出问题:

中间有个小插曲,我看发现我在启动了托盘类ShowMessage()这个函数的时候,电脑没有任何反应,我还以为是我的代码问题,或者是win10 的版本问题(专业工作站版本),原来毛病出自这里

折腾一下午,同时还要注意一个地方:

这里有可能也会阻止通知信息的弹出。

Qt TCP/IP

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:嵌入式设备——如何实现主车前进?
下一篇:简明图解冯·诺依曼计算机体系
相关文章