精英盒子 -> 程序设计 -> Qt创建和使用托盘图标-零毫秒技术爆料 [打印本页]

jybox 2012-01-09 17:15

Qt创建和使用托盘图标-零毫秒技术爆料

如题,Qt创建和使用托盘图标
零毫秒就使用了托盘图标,而且点击主窗口的关闭的时候不会直接退出,而是最小化到托盘,下面来简单讲讲如何实现
ps.零毫秒的源代码托管:https://github.com/jybox/ZeroMS
但这个教程基于零毫秒0.0.4.5(不排除以后代码会修改)https://github.com/jybox/ZeroMS/tree/01cb8f72f634f4a912c96f973b2eb94e027430a1

首先,Qt中有关托盘的类是QSystemTrayIcon
所以要先包含头文件:
  1. #include <QSystemTrayIcon>

另外这个类属于QtGUI,还要确认pro文件里启用了QtGui模块


在类定义中增加几个指针,分别是托盘对象和托盘右键菜单的
ps.右键菜单一般和托盘一起用,没意见吧
注意不一定是要加载窗口类里,加在哪里都可以,但是不能作为局部变量(否则这个函数执行完马上就被销毁了)
  1. class MainWidget:public QMainWindow
    {
        Q_OBJECT
    public:
        explicit MainWidget(QWidget *parent=0);
    private:
        QSystemTrayIcon *trayIcon;//托盘
        QMenu *trayMenu;//托盘图标菜单
    QAction *ActQuit;//退出按钮
        //....
    };
然后在构造函数里对着这几个指针进行初始化
  1. MainWidget::MainWidget(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWidget)
    {
        ui->setupUi(this);
        //退出按钮
        ActQuit = new QAction(MainWidget);
        ActQuit->setObjectName(QString::fromUtf8("ActQuit"));
        ActQuit->setText("退出");
        connect(ActQuit,SIGNAL(triggered()),this,SLOT(deleteLater()));

        //托盘菜单
        trayMenu=new QMenu(this);
        trayMenu->addAction(ui->ActQuit);
        trayMenu->addSeparator();

        //托盘图标
        trayIcon=new QSystemTrayIcon(this);
        QIcon icon(":/images/40_0ms.png");//图标
        trayIcon->setIcon(icon);
        trayIcon->show();
        trayIcon->setContextMenu(trayMenu);
        connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason)));
    }

然后写托盘图标的事件处理
先在头文件增加这个处理函数:
  1. private slots:
        void onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason);

然后实现:
  1. void MainWidget::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason)
    {
        switch(reason)
        {
            case QSystemTrayIcon::Trigger://单击
            case QSystemTrayIcon::DoubleClick://双击
                show();//显示窗口
                activateWindow();//设为活动窗口
                break;
            default:
                break;
        }
    }

接下来实现关闭主窗口的时候最小化到托盘:
需要重载QWidget的closeEvent函数,在头文件增加:
  1. private:
        void closeEvent(QCloseEvent *event);

然后实现:
  1. void MainWidget::closeEvent(QCloseEvent *event)
    {
        if(trayIcon && trayIcon->isVisible())      //如果托盘图标还存在且可见
        {
            hide();//隐藏窗口
            event->ignore();//不让基类再处理这个事件(不关闭窗口)
        }
    }



完成..







abreto 2012-01-09 17:19
沙发,表示看过,有用的时候再看

abreto 2012-01-09 17:24
不过Unity和GNOME3貌似没托盘

jybox 2012-01-09 17:27
abreto:不过Unity和GNOME3貌似没托盘 (2012-01-09 17:24) 

这个不合常理啊,我还没用过Unity和GNOME3,有空调研一下

whtsky 2012-01-09 18:37
…加个代码高亮吧…

jybox 2012-01-09 21:02
whtsky:…加个代码高亮吧… (2012-01-09 18:37) 

懒得折腾了....




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.057686 second(s),query:5 Gzip enabled