<十一>系统托盘的显示
最后更新于:2022-04-01 07:11:32
# 【Qt编程】基于Qt的词典开发系列系统托盘的显示
本文主要讨论Qt中的系统托盘的设置。系统托盘想必大家都不陌生,最常用的就是QQ。系统托盘以简单、小巧的形式能让人们较快的打开软件。废话不多说,下面开始具体介绍。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-15_5698c1c8eab8d.jpg)
首先,新建一个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、界面如下(这不是我们关注的地方):
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-15_5698c1c909587.jpg)
~~~
2、托盘显示如下:
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-15_5698c1c91ba8f.jpg)
~~~
3、托盘的菜单显示如下:
~~~
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-15_5698c1c92e1e4.jpg)