| 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 所以要先包含头文件:
- #include <QSystemTrayIcon>
另外这个类属于QtGUI,还要确认pro文件里启用了QtGui模块 在类定义中增加几个指针,分别是托盘对象和托盘右键菜单的 ps.右键菜单一般和托盘一起用,没意见吧 注意不一定是要加载窗口类里,加在哪里都可以,但是不能作为局部变量(否则这个函数执行完马上就被销毁了)
- class MainWidget:public QMainWindow
{ Q_OBJECT public: explicit MainWidget(QWidget *parent=0); private: QSystemTrayIcon *trayIcon;//托盘 QMenu *trayMenu;//托盘图标菜单 QAction *ActQuit;//退出按钮 //.... };
然后在构造函数里对着这几个指针进行初始化
- 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))); }
然后写托盘图标的事件处理 先在头文件增加这个处理函数:
- private slots:
void onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason);
然后实现:
- void MainWidget::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason)
{ switch(reason) { case QSystemTrayIcon::Trigger://单击 case QSystemTrayIcon::DoubleClick://双击 show();//显示窗口 activateWindow();//设为活动窗口 break; default: break; } }
接下来实现关闭主窗口的时候最小化到托盘: 需要重载QWidget的closeEvent函数,在头文件增加:
- private:
void closeEvent(QCloseEvent *event);
然后实现:
- void MainWidget::closeEvent(QCloseEvent *event)
{ if(trayIcon && trayIcon->isVisible()) //如果托盘图标还存在且可见 { hide();//隐藏窗口 event->ignore();//不让基类再处理这个事件(不关闭窗口) } }
完成..
|
|