1. 程式人生 > >Qt之程式最小化托盤顯示及操作

Qt之程式最小化托盤顯示及操作

1.功能說明

對於GUI程式,如果想要實現當最小化時,程式從工作列消失,在系統托盤顯示一個圖示,表示此程式,並能在托盤內通過雙擊或者選單使程式介面恢復。

2.使用的類

主要使用的此類:QSystemTrayIcon。
其中QSystemTrayIcon是主要作業系統托盤的操作類,通過此類,可以在托盤顯示指定程式的圖示,響應使用者滑鼠的單擊,雙擊,或wheel操作(好像只對X11系統有用),顯示指定訊息,顯示選單等。
此類中有兩個列舉型別,分別如下:
enum QSystemTrayIcon::ActivationReason 表述托盤上圖示的觸發緣由

常量描述
QSystemTrayIcon::Unknown0未知原因
QSystemTrayIcon::Context1請求系統托盤的上下文選單
QSystemTrayIcon::DoubleClick2滑鼠雙擊
QSystemTrayIcon::Trigger3滑鼠單擊
QSystemTrayIcon::MiddleClick4滑鼠中間按鍵

enum QSystemTrayIcon::MessageIcon 當顯示氣球訊息時顯示的圖片

常量描述
QSystemTrayIcon::NoIcon0不顯示圖示
QSystemTrayIcon::Information1顯示資訊圖示
QSystemTrayIcon::Warning2顯示告警圖示
QSystemTrayIcon::Critical3顯示致命圖示

3.QSystemTrayIcon常用函式

void setIcon(const QIcon& icon)
設定系統托盤的圖示
void setToolTip(const QString &tip)
設定滑鼠放到圖示上的提示文字
void setContextMenu(QMenu* menu);
設定當點選圖示彈出的選單
void show()
顯示系統托盤圖示

4.程式碼

1.實現程式托盤顯示

a)新建一個QWidget程式,在介面上放入一個QPushButton,text改為“最小化”,如下圖:
這裡寫圖片描述

b)給工程加入Qt Resource資原始檔,新增一個在托盤顯示的icon圖片,如圖:
這裡寫圖片描述


c)給a中的QPushButton,建立槽函式,在槽函式內實現程式最小化托盤顯示

void MainWindow::on_pushButton_clicked()
{
    //隱藏程式主視窗
    this->hide();

    //新建QSystemTrayIcon物件
    mSysTrayIcon = new QSystemTrayIcon(this);
    //新建托盤要顯示的icon
    QIcon icon = QIcon("../IMClient/Resources/GG64.png");
    //將icon設到QSystemTrayIcon物件中
    mSysTrayIcon->setIcon(icon);
    //當滑鼠移動到托盤上的圖示時,會顯示此處設定的內容
    mSysTrayIcon->setToolTip(QObject::trUtf8("測試系統托盤圖示"));
    //在系統托盤顯示此物件
    mSysTrayIcon->show();
}

執行程式,點選按鈕最小化,可以在系統托盤看到此圖示,滑鼠移到上面,可以見看見程式碼中所設的”測試系統托盤圖示”文字,如圖:
這裡寫圖片描述

2.實現托盤圖示操作

最小化後顯示在系統托盤內,此時除了在工作管理員中結束此程式,無法再做其他操作,而我們還想實現雙擊圖示顯示主介面,單擊圖示彈出選單等實現其他操作,此時,就需要使用QSystemTrayIcon::ActivationReason屬性了。
a)給QSystemTrayIcon物件新增訊號為activated(QSystemTrayIcon::ActivationReason)的槽函式
b)在槽函式內,對雙擊事件,顯示主視窗介面
程式碼如下:

void MainWindow::on_pushButton_clicked()
{
    //隱藏主視窗
    this->hide();

    ......
    //當滑鼠移動到托盤上的圖示時,會顯示此處設定的內容
    mSysTrayIcon->setToolTip(QObject::trUtf8("測試系統托盤圖示"));
    //給QSystemTrayIcon新增槽函式
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
    //在系統托盤顯示此物件
    mSysTrayIcon->show();
}
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        //單擊托盤圖示
        break;
    case QSystemTrayIcon::DoubleClick:
        //雙擊托盤圖示
        //雙擊後顯示主程式視窗
        this->show();
        break;
    default:
        break;
    }
}

程式最小化後,雙擊托盤圖示,程式的主介面可以顯示了。

最後再來考慮在單擊系統托盤圖示時,顯示選單功能。根據上面描述,思路很明確了,如下:
a)新建一個QMenu menu
b)將menu通過QSystemTrayIcon的setContextMenu函式設定到QSystemTrayIcon物件中
再來看程式碼實現:
在標頭檔案中新增:

    QMenu *mMenu;
    QAction *mShowMainAction;
    QAction *mExitAppAction;
    ...
    public:
    void createActions();
    void createMenu();
    ...
    private slots:
    ...
    void on_showMainAction();
    void on_exitAppAction();

在cpp中實現:

void MainWindow::createActions()
{
    mShowMainAction = new QAction(QObject::trUtf8("顯示主介面"),this);
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
    connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));

}

void MainWindow::createMenu()
{
    mMenu = new QMenu(this);
    //新增選單項---顯示主介面
    mMenu->addAction(mShowMainAction);
    //增加分隔符
    mMenu->addSeparator();
    //新增選單項---退出程式
    mMenu->addAction(mExitAppAction);
    //把QMenu賦給QSystemTrayIcon物件
    mSysTrayIcon->setContextMenu(mMenu);
}
/*
* 當在系統托盤點選選單內的顯示主介面操作
*/
void MainWindow::on_showMainAction()
{
    this->show();
}

/*
* 當在系統托盤點選選單內的退出程式操作
*/
void MainWindow::on_exitAppAction()
{
    exit(0);
}

然後

void MainWindow::on_pushButton_clicked()
{
    ......
    //給QSystemTrayIcon新增槽函式
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));

    //建立托盤操作的選單
    createActions();
    createMenu();
    //在系統托盤顯示此物件
    mSysTrayIcon->show();
}

最後再看看訊息球的使用

void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        //顯示訊息球,1s後自動消失
        //第一個引數是標題
        //第二個引數是訊息內容
        //第三個引數圖示
        //第四個引數是超時毫秒數
        mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                  QObject::trUtf8("歡迎使用此程式"),
                                  QSystemTrayIcon::Information,
                                  1000);
        break;
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;
    }
}

關於系統托盤操作的筆記就記錄到此了,最後是完整程式碼的實現。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
    QSystemTrayIcon *mSysTrayIcon;
    QMenu *mMenu;
    QAction *mShowMainAction;
    QAction *mExitAppAction;

public:
    void createActions();
    void createMenu();

private slots:
    void on_pushButton_clicked();
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
    void on_showMainAction();
    void on_exitAppAction();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QIcon>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //隱藏主視窗
    this->hide();

    //新建QSystemTrayIcon物件
    mSysTrayIcon = new QSystemTrayIcon(this);
    //新建托盤要顯示的icon
    QIcon icon = QIcon("../IMClient/Resources/GG64.png");
    //將icon設到QSystemTrayIcon物件中
    mSysTrayIcon->setIcon(icon);
    //當滑鼠移動到托盤上的圖示時,會顯示此處設定的內容
    mSysTrayIcon->setToolTip(QObject::trUtf8("測試系統托盤圖示"));
    //給QSystemTrayIcon新增槽函式
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));

    //建立托盤操作的選單
    createActions();
    createMenu();
    //在系統托盤顯示此物件
    mSysTrayIcon->show();
}

void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                  QObject::trUtf8("歡迎使用此程式"),
                                  QSystemTrayIcon::Information,
                                  1000);
        break;
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;
    }
}

void MainWindow::createActions()
{
    mShowMainAction = new QAction(QObject::trUtf8("顯示主介面"),this);
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
    connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));

}

void MainWindow::createMenu()
{
    mMenu = new QMenu(this);
    mMenu->addAction(mShowMainAction);

    mMenu->addSeparator();

    mMenu->addAction(mExitAppAction);

    mSysTrayIcon->setContextMenu(mMenu);
}

void MainWindow::on_showMainAction()
{
    this->show();
}

void MainWindow::on_exitAppAction()
{
    exit(0);
}

相關推薦

Qt程式托盤顯示操作

1.功能說明 對於GUI程式,如果想要實現當最小化時,程式從工作列消失,在系統托盤顯示一個圖示,表示此程式,並能在托盤內通過雙擊或者選單使程式介面恢復。 2.使用的類 主要使用的此類:QSystemTrayIcon。 其中QSystemTrayIcon是

C# 開機自啟動和托盤顯示

一、      C# 開機自啟動 C# 開機自啟動,這個功能是大多數服務型軟體很常用一個功能,但是這個功能確是不 太好做,花了兩天想對策。不過最終呢,結果還是很滿意的。  這個功能要達到的效果是這樣的,所有使用者開機自啟動。  最初在網上找的資料都是修改登錄檔,基本上

Qt程式執行,還原後窗體不重新整理的問題

  Qt程式最小化執行,還原後窗體不重新整理的問題解決 程式執行現象是這樣的,一個包含有QTableWidget的窗體,Item上使用setCellWidget方法嵌入的自定義的widget,上面顯示下載進度條、按鈕等等。當下載任務進行的時候,進度條是動態顯示完成百分比的,此時將其

win10程式後任務欄沒有顯示的解決方法

通常情況下我們會在電腦開啟很多應用程式,當我們暫時不需要使用的時候我們會將它最小化,最小化後會以縮圖的形式出現在工作列中,等我們有需要的時候再開啟就行。但是今天用電腦時發現將程式最小化之後工作列中卻看不到程式的最小化視窗(注意為win10作業系統),這樣使用帶來非常的不方便,那麼為什麼會出現這種情況呢?經研究

Python:程式托盤功能實現

  本文講解如何裝python的開發的命令列程式最小化到托盤的方法,並提供選單操作功能。   上個月使用python實現了一個多功能抓圖工具,見《Python:一個多功能的抓圖工具開發(附原始碼)》,此程式為一個命令列程式,windows下執行時會彈出一個cmd視窗,裡面什

程式托盤(實用工具)

如何將程式最小化到系統托盤? 有些軟體點選最小化是自動最小化到系統托盤而不是工作列的(如QQ,MSN,各種防毒軟體等等),多數軟體點選最小化會將軟體最小化到工作列(如IE,文件等等),怎麼讓這些軟體也最小化到系統托盤呢?利用工具可以幫到你:Tray Everything Tray Everything 使用

C# 程式到系統托盤

  找一個好的ICO圖示。 1、放一個notifyIcon1和contextMenuStrip1控制元件。 2、在notifyIcon1屬性中,關聯加入contextMenuStrip1控制元件。 3、notifyIcon1增加事件:notifyIcon1_MouseD

C#winform中怎麼將程式到系統托盤

1.在form中新增一個NotifyIcon控制元件        2.把87.ico這個圖示放在/bin/Debug目錄下     using System;   using System.Collections.Generic;   using System.Compon

Qt開發:托盤

其實qt的幫助文件裡面有個例子,另外很多api在QSystemTrayIcon類裡面。 首先建立Qt的gui工程,本文預設都帶了ui檔案,如果不帶ui檔案,需要在程式裡手動程式碼寫ui,所有程式碼都未修改main.cpp,就不貼了。 初級 mainwindow.h #in

MFC程式到系統托盤

          為了使MFC程式(SDI,MDI,DLG)均能最小化到系統托盤,這裡運用訊息機制來實現系統托盤效果。           那麼什麼是托盤呢?所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或

VC++MFC對話方塊應用程式實現程式到系統托盤

轉自:http://blog.sina.com.cn/s/blog_6b23bc700100pqrm.html  現在使用系統托盤圖示的程式越來越多,尤其是需要長時間執行的程式。這並不是什麼高深的技術,純當做個筆記。  第一步:定義一個 NOTIFYICONDATA 結構

托盤的實現方法

fyi typedef hand delet odi 功能 content call not 在書上看到的,認為實用,記下了。 首先,最小化托盤的基本原理是,將應用程序的主窗口隱藏,然後在托盤中繪制應用程序的圖標。然後再為托盤圖標加入一些事件處理。 核心函數是Shell

VMware安裝CentOS二——安裝CentOS

VMware CentOS 1、上文已經創建了一個虛擬機,現在我們點擊開啟虛擬機。2、虛擬機進入到安裝的界面,在這裏我們選擇第一行,安裝或者升級系統。3、這裏會提示要檢查光盤,我們直接選擇跳過。 4、這裏會提示我的硬件設備不被支持,點擊OK,實際對安裝使用沒有影響的,其他電腦沒有出現這個提示。5

C# 系統應用窗體至工作列常用操作

一.介面操作 1.建立"Windows窗體應用程式"專案,從"工具箱"中新增NotifyIcon(執行時期間在Windows工作列右側的通知區域顯示圖示).滑鼠右擊notifyIcon1屬性,為控制元件屬性Icon新增圖示,Text屬性為"CSDN". 2

VS2010 MFC 啟動立刻隱藏視窗 托盤

MFC新增最小化托盤(右下角小圖示) 方法網上很多,我也是按照如上實現 vs2010寫的 Dlg的.h檔案新增 NOTIFYICONDATA   nid; //托盤圖示 Dlg的.cpp檔案,OnInitDialog新增: nid.cbSize=(DWORD)sizeof(

VB.net 程式到狀態列

1、先搞清楚什麼是狀態列,什麼是工作列(taskbar) 2、前一篇文章寫了通過closing時間最小化到工作列,有一些難度。微軟預設是最小化到工作列的。 ——————————以下正文—————————— 3、窗體增加NotifyIcon控制元件 4、方案1:for

總結:一個簡單的MFC實現托盤效果

先上說明,最後我會附上程式碼,我也是臨時新學的,請諸位指正 對於標頭檔案中的CxxxDlg類定義而言,需要新增以下幾個地方,見下圖 對於上圖中的最下面的public部分,略作解釋 NOTIFYICONDATA m_nid; //新增成員變數 afx_msg LRESUL

[C#]C# 托盤

先新增notifyicon控制元件notifyIcon1 複製程式碼 using System; using System.Collections.Generic; using System.ComponentModel; using System

CentOS7安裝後的操作

install centos7 -o lld 完成 命令 進入 ifconf 緩存 1.更換yum源 #先進入源的目錄 cd /etc/yum.repo.d #備份一下官方源 mv CentOS-Base.repo CentOS-Base.repo.bak #將阿裏

Qt 托盤程式退出

主介面hide之後,程式退出,可在隱藏之前呼叫如下函式 setQuitOnLastWindowClosed(bool quit)來更改當前值。這個屬性用來保留"當最後一個視窗關閉的時候,應用程式是否隱式退出",預設值是true。true:退出,false:不退出。   因此,當