QT系统托盘

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给到菜单,然后进行显示,当然显示这里还需要做进一步的调整,比如大小,位置,显示等等,这些就大家来操作一下,也欢迎给一个更好的解决方案

  • 46
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值