1、创建和保留系统托盘
使用QSystemTrayIcon类创建一个对象设置一个图标调用show就可以在程序运行的时候有一个托盘图标了
QSystemTrayIcon* trayIcon=new QSystemTrayIcon(this);
trayIcon->setIcon(QIcon(":/png/greenStone.png"));
trayIcon->show();
这种情况下,对象不提前死亡,托盘不会消失,但是如果直接关闭窗口,那么托盘还是会一起消失的。
如果是需要关闭程序的时候还要保留托盘,重写窗口的关闭事件
void Widget::closeEvent(QCloseEvent *event)
{
if(trayIcon->isVisible()) //托盘是显示的
{
QMessageBox::information(this,"提示","程序最小化,通过系统托盘右键关闭");
this->hide(); //隐藏程序
event->ignore(); //忽略关闭事件,这样才不会关闭程序
}
}
关闭事件中只是隐藏程序,然后还要忽略关闭事件,就可以了,就可以得到如下
2、常用操作
在QT的系统托盘图标是可以点击,双击,中键点击,和右键菜单
点击,双击,中间点击比较简单,QSystemTrayIcon具有信号activated,关联一下,判断参数即可,下面列出三个
//槽函数,用来处理点击托盘的操作
void Widget::trayActivated(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger: //点击
case QSystemTrayIcon::DoubleClick: //双击
case QSystemTrayIcon::MiddleClick: //中键点击
}
}
右键菜单稍微麻烦点,需要自己创建一个菜单关联号相关内容,然后进行添加
菜单的创建
//可以定义在.h文件中
QMenu *trayIconMenu;
QAction *minimizeAction;
QAction *maximizeAction;
QAction *restoreAction;
QAction *quitAction;
//下面的构造函数中进行执行
minimizeAction=new QAction("最小化",this);
connect(minimizeAction,&QAction::triggered,this,&Widget::hide);
maximizeAction=new QAction("最大化",this);
connect(maximizeAction,&QAction::triggered,this,&Widget::showMaximized);
restoreAction=new QAction("还原",this);
connect(restoreAction,&QAction::triggered,this,&Widget::showNormal);
quitAction=new QAction("退出",this);
//connect(quitAction,&QAction::triggered,this,&Widget::close); //关联窗口的close不太合适
connect(quitAction,&QAction::triggered,this,&QCoreApplication::quit); //应用程序的退出
//创建菜单,添加菜单项
trayIconMenu=new QMenu(this);
trayIconMenu->addAction(minimizeAction);
trayIconMenu->addAction(maximizeAction);
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator(); //分割线
trayIconMenu->addAction(quitAction);
//给系统托盘添加右键菜单
trayIcon->setContextMenu(trayIconMenu);
程序运行,点击X关闭窗口,会先提示程序最小化,通过系统托盘右键关闭。然后右键托盘点击退出进行退出程序
在退出的菜单项关联窗口的close不合适,这样在调用的时候窗口会关闭,但是还会调用到关闭事件的,也就是会有上面的提示,所以直接关联应用程序的退出,那么就是直接退出程序,不会调用窗口的关闭事件了。
当然也可以再加一行代码
trayIcon->setToolTip("这是一个托盘示例");
当鼠标悬停再图标上面就会有一个提示,这是一个托盘示例
3、其他
做到这里大家应该会觉得功能太少对吧,像有些托盘菜单里面可以选中,有菜单项的图片,背景好看等等。这些对于QT而已过于简单就不写代码了。选中,菜单项图片通过QAction的成员可以轻松设置。
选中调用setCheckable(true);就可以了点击只会,那么在菜单项的左边就会有选中,再次点击可以取消选中
菜单项图标调用setIcon(QIcon(":/png/redStone.png"));但是注意如果是同一个菜单项设立这两个,那么菜单项的左边会有图标,然后选中的时候,是图标高亮选中,但是个人觉得这个高亮不怎么亮,也可能是我的图片问题
背景这些通过样式表进行设置,不会的就自己百度一下,有的是示例和教程
有人可能会像,这个简单对吧我看看成员就行,但是我们肯定会想要的更加自由一点,比如说像
这样一样,右键弹出一个完全我自己决定的菜单窗口,带点控件这些东西,那么怎么办呢?这样的操作是不是有点难了,其实也是挺简单的。
简单的操作某一个QAction,可以使用associatedWidgets成员来获取,一般是只有会有一个小部件,也就是当前这个菜单项自己,通过QList<QWidget*>来接收,也就是得到一个窗口,那么剩下的大家就应该会操作了,但是这种做法不好用,如果像上面一样内容多,还大,就不行了,所以我们要从QMenu下手
QMenu菜单,他是继承QWidget的,所以我可以认为在右键弹菜单的时候,这个菜单本质上是一个窗口,我只要得到这个窗口那么我就可以为所欲为了。那么怎么得到窗口呢?
其实使用QMenu定义的对象就可以看作为窗口对象,那么现在窗口对象有了,怎么创建一个窗口出来,大家是不是有了想法呢?
这里给一个看起来还行的方案,直接创建一个QWidget窗口,做好界面,然后直接把QWidget给到菜单,然后进行显示,当然显示这里还需要做进一步的调整,比如大小,位置,显示等等,这些就大家来操作一下,也欢迎给一个更好的解决方案