牛骨文教育服务平台(让学习变的简单)

【Qt编程】基于Qt的词典开发系列系统托盘的显示

本文主要讨论Qt中的系统托盘的设置。系统托盘想必大家都不陌生,最常用的就是QQ。系统托盘以简单、小巧的形式能让人们较快的打开软件。废话不多说,下面开始具体介绍。

首先,新建一个Qt Gui项目,类型选择QMainWindow,类名也选择默认的mainwindow。这时,工程项目中就有3个文件(界面文件不用管):mainwindow.h mainwindow.cpp main.cpp。然后,分别修改3个文件如下

1、mainwindow.h

#ifndef MAINWINDOW_H  
#define MAINWINDOW_H  
#include <QMainWindow>  
#include<QSystemTrayIcon>  
#include<QMenu>  
#include<QCloseEvent>  
namespace Ui {  
class MainWindow;  
}  
class MainWindow : public QMainWindow  
{  
    Q_OBJECT  
      
public:  
    explicit MainWindow(QWidget *parent = 0);  
    ~MainWindow();  
      
private:  
    Ui::MainWindow *ui;  
    QSystemTrayIcon *trayicon;//将系统托盘及菜单定义为窗口的私有成员  
    QMenu *trayiconMenu;  
signals:  
    void exitsignal();//发射程序退出信号  
private slots:  
    void onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason);  
    void exit();//与退出按钮对应的槽  
protected:  
    void closeEvent(QCloseEvent *event);  
};  
#endif // MAINWINDOW_H  

2、mainwindow.cpp

#include "mainwindow.h"  
#include "ui_mainwindow.h"  
#include<QtGui>  
#include<QEvent>  
#include<QDebug>  
#include<QAction>  
MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::MainWindow)  
{  
     ui->setupUi(this);  
    trayicon=new QSystemTrayIcon(this);  
    QAction *quit=new QAction(tr("exit"), this);  
    QIcon icon("D:/studytool/Qt/workspace/myTray/tengweitw.jpg");//注意修改这里的图片目录  
    setWindowIcon(icon);  
//    setMinimumSize(200,100);//窗口最大化和最小化一样大小。所以窗口不能放大也不能缩小  
//    setMaximumSize(200,100);  
    trayiconMenu=new QMenu(this);  
    trayiconMenu->addAction(quit);//这里可以添加多个菜单  
   // trayiconMenu->addSeparator();  
    trayicon->setIcon(icon);  
    trayicon->setToolTip(tr("我爱记单词"));  
    trayicon->setContextMenu(trayiconMenu);  
    connect(quit,SIGNAL(triggered(bool)),this,SLOT(exit()));  
    connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason)));  
    trayicon->show();  
}  
MainWindow::~MainWindow()  
{  
    delete ui;  
}  
//下面处理不同情况下,单击托盘图标的操作  
void MainWindow::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason)  
{  
  switch(reason)  
  {  
  //单击  
  case QSystemTrayIcon::Trigger:  
    //  qDebug()<<this->isEnabled();  
  //双击  
 //     flag=!flag;  
 // case QSystemTrayIcon::DoubleClick:  
      //恢复窗口显示  
      if(this->isVisible())//判断窗口是否可见  
      {  
          if(this->isMinimized())//窗口是否是最小化  
            {  
                this->setWindowFlags(Qt::WindowStaysOnTopHint);//置顶  
            //  this->setWindowFlags(Qt::Widget);//取消置顶  
                this->setWindowState(Qt::WindowActive);  
                this->setGeometry(this->geometry());//使得每次显示窗口为上次的位置  
                this->show();  
            }  
          else  
                this->hide();  
      }  
       else  
      {  
          this->setWindowFlags(Qt::WindowStaysOnTopHint);//置顶  
            //  this->setWindowFlags(Qt::Widget);//取消置顶  
                this->setWindowState(Qt::WindowActive);  
                this->setGeometry(this->geometry());  
                this->show();  
      }  
      break;  
  default:  
      break;  
  }  
}  
void MainWindow::exit()  
{  
    emit exitsignal();  
}  
void MainWindow::closeEvent(QCloseEvent *event)//处理窗口关闭事件  
{  
  if(trayicon->isVisible())  
  {  
      hide();  
      this->close();  
      event->ignore();  
  }  
}  

3、main.cpp

#include <QtGui/QApplication>  
#include "mainwindow.h"  
#include<QTextCodec>  
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//防止中文乱码  
    MainWindow w;  
    w.show();  
    QObject::connect(&w,SIGNAL(exitsignal()),&a,SLOT(quit()));//将退出按钮与退出函数绑定  
    return a.exec();  
}  
上面程序的主要部分都给了注释,在这就不一一分析了。运行结果如下:
1、界面如下(这不是我们关注的地方):

2、托盘显示如下:

3、托盘的菜单显示如下: