# 【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、托盤的菜單顯示如下:
~~~

- 前言
- <一>--詞典框架設計及成品展示
- <二>--本地詞典的設計
- <三>--開始菜單的設計
- <四>--無邊框窗口的縮放與拖動
- <五>--無邊框窗口的拖動
- <六>--界面美化設計
- <七>--調用網絡API
- <八>--用戶登錄及API調用的實現
- <九>--JSON數據解析
- <十>--國際音標的顯示
- <十一>系統托盤的顯示
- <十二>調用講述人
- <十三>音頻播放
- <十四>自動補全功能
- <十五>html特殊字符及正則表達式
- 后序