1. 程式人生 > >Qt之定製個性化系統托盤選單

Qt之定製個性化系統托盤選單

導讀

    一款流行的軟體,往往會在功能漸趨完善的時候,通過改善互動介面來提高使用者體驗。畢竟,就算再牛逼的產品,躲藏在糟糕的使用者介面之後總會讓使用者心生不滿。介面設計需綜合考慮審美學、心理學、設計學等多因素,是一份精細活。這篇博文仍然以Qt的使用為主旨,探討一下在Qt中如何進行系統托盤的個性化定製。

介紹

    首先我們看看幾款知名軟體的系統托盤設計:

    上圖是金山衛士的系統托盤選單設計。我們稍作分析:整個托盤選單視窗是個半透明的設計,視窗邊框進行了圓角處理。底部的選單項包含三個Button,倒數第二、三個選單項的右部還加上了一個自定義的單選按鈕。頂部選單項則包含一個評級元件;其他選單項則沒有什麼特別,加上對應的圖示即可完成設計。但是可能由於整個背景色的緣故,導致整體效果看起來灰濛濛的,不太亮堂。

     上圖是360安全衛士的托盤選單。頂部和底部的兩個選單項都將背景色設定成了360安全衛士的主題色,加上了兩個標籤和按鈕。其他選單項保持不變。另外,選單的背景色也被設定成了白色。整個選單的設計較為簡潔、清爽。雖然並不喜歡用360安全衛士,但是並不妨礙我對其產品外觀設計的讚賞。

原型設計

     既然有了上述兩款產品的參考,我們也可以試著設計下自己的系統托盤。首先我們需要一個原型設計工具,將草圖繪製好我們才能用程式碼將最終結果顯示出來。這裡推薦一個原型設計工具:Balsqmiq mockup。這款工具使用簡單,其提供的原型元件非常豐富,使用會覺得非常方便。

     根據初步設想,我設計瞭如下的一個原型草圖:

      在佈局方面基本上綜合了金山衛士和360安全衛士的設計特點。頂部選單項部署兩個Label, 一個用來顯示應用程式的視窗標題或產品名稱,另一個顯示為go to visit,可以響應滑鼠點選事件。底部選單項和金山衛士一樣,設定了三個按鈕:Update, about, exit,使用水平均勻佈局。其他的選單項則和普通選單項沒有區別。 基本上,一個自定義的托盤選單已經躍然而出。

程式碼實現

      根據上述的原型設計,我們要做的準備工作顯然就是準備好圖片。對於沒有美工技能的程式設計師來說,尋找介面圖片素材顯然是一大難題。做不出圖片顯然只好去網上搜索了。本人在網上下載了一堆的圖片壓縮包,有一個值得推薦:

異次元圖示。另外還有一個圖片搜尋網站也值得推薦。在這裡我準備的圖片如下:

      每個圖片都取了一個別名,這樣在程式碼中我們直接使用圖片別名,從而消除與圖片具體名稱的藕合性。資源準備好之後我們需要開始編碼了。參考本人曾經寫過的一篇博文(使用Qt建立系統托盤),可以實現一個預設主題的系統托盤選單。但是這裡我們要實現自定義托盤選單,我們從QSystemTray派生一個子類,並定義好相關的類成員變數:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 QMenu* m_trayMenu; QWidget* m_topWidget; QWidgetAction* m_topWidgetAction; QLabel* m_topLabel; QLabel* m_homeBtn; QWidget* m_bottomWidget; QWidgetAction* m_bottomWidgetAction; QPushButton* m_updateBtn; QPushButton* m_aboutBtn; QPushButton* m_exitBtn; QAction* m_runOnSystemBoot; QAction* m_helpOnline; QAction* m_homePage; QAction* m_notification; QAction* m_settings;

  顯然,我們注意到一個平時沒有接觸到的:QWidgetAction。這個類自Qt 4.2引入,繼承自QAction。根據類名也可以推測出其含義:使用QWidget來充當Menu的Action。於是,我們似乎明白了自定義選單的精髓:用Widget來做Action。這裡我們主要定義頂部選單項和底部選單項。因此我們定義了兩個QWidgetAction。另外,我們還有一個疑問就是:佈局好的Widget如何"偽裝"成Action插入到選單項中去呢?我們可以使用QWidgetAction的setDefaultWidget()方法來完成這項工作。後面的程式碼將會有說明。

      此外,我們還注意到:360安全衛士的底部選單項和頂部選單項的背景色都是綠色的這又該如何實現呢?一種可行的方法是,安裝一個事件過濾器(Event Filter)。當過濾到繪製事件並且繪製的元件是頂部選單項和底部選單項時,我們改變繪製方式。程式碼如下:

1 2 3 4 5 6 7 8 9 10 11 bool SystemTray::eventFilter(QObject *obj, QEvent *event) { if (obj == m_topWidget && event->type() == QEvent::Paint) { QPainter painter(m_topWidget); painter.setPen(Qt::NoPen); painter.setBrush(QColor(42, 120, 192));

相關推薦

Qt定製個性化系統托盤選單

導讀     一款流行的軟體,往往會在功能漸趨完善的時候,通過改善互動介面來提高使用者體驗。畢竟,就算再牛逼的產品,躲藏在糟糕的使用者介面之後總會讓使用者心生不滿。介面設計需綜合考慮審美學、心理學、設計學等多因素,是一份精細活。這篇博文仍然以Qt的使用為主旨,探

QT坐標系統

QT 坐標系統 GUI操作系統都有其特定的坐標系統;我們本節要在坐標系統中進行窗口和部件的定位,定位類型分為3種: 1、頂級窗口部件的定位 2、窗口內部件的定位 3、窗口部件的大小設置 Qt 使用同一的坐標系統定位窗口部件的位置和大小;Qt 部件類提供成員函數在坐標系統中進行定

定製系統啟動選單

裝了centos後,主啟動檔案被覆蓋後,預設是進入centos系統,並且如果你不知道按方向銉來切換的話,你

Qt 系統托盤(加hover效果)

界面 lose bytearray blog ndb pex 打開 tip tin 最近項目需要添加系統托盤,本來Qt的QSystemTrayIcon可以實現的,但是要求要添加hover效果,並顯示未讀消息(就和qq的托盤差不多,移動上去顯示未讀列表),加了這個要求QSys

使用QT創建系統托盤

ati 將不 文件對話框 n) 添加圖標 調用 系統 沒有 nal 使用QT來創建一個系統托盤,事實上是一件很簡單的事。為什麽這麽說?一是因為QT文檔給出了比較詳細的例子,二是QT的結構比較優雅,設計風格統一。但是在動手之前,我們要從哪裏下手?雖然QT文檔給出了一個比較詳細

VC MFC系統托盤右鍵選單,滑鼠點選非選單區域使選單消失的問題

程式最小化到系統托盤後,右鍵單擊托盤圖示會顯示選單。 現在的問題是如果不點選選單上的選項選單就會一直存在,如何使滑鼠在選單視窗外單擊操作時選單消失? 就像桌面右鍵選單那樣。 CMenu menu;  menu.LoadMenu(IDR_MNU_TRAY); // 2 CMe

Qt右鍵選單

1、右鍵選單建立和顯示作為一種互動性強、使用方便的右鍵選單在程式中是非常常用的,在Qt中可以輕鬆的實現。QMenu menu; //新增選單項,指定圖示、名稱、響應函式 menu.addAction(QIcon("1.png"), QStringLiteral("新增"),this,SLOT(OnBscGr

C# WinForm視窗最小化到系統托盤右擊托盤圖示彈出退出選單

1. 在Form上加notifyicon控制元件myIcon,為控制元件的屬性Icon新增一個icon圖示, Text為滑鼠在圖示上時顯示的名字。 2. 新增ContextMenuStrip控制元件myMenu,右鍵托盤圖示彈出選單,設定myIcon的ContextMen

MFC 系統托盤圖示實現,包括雙擊圖示和右鍵圖示選單

首先,必須知道一個結構體NOTIFYICONDATA ,這是MFC中包含系統需要的用來傳遞托盤區域訊息的資訊結構體,有了它,我們今天的任務就完全可以輕鬆完成了!      這時候,我們可以在我們的類中申明一個NOTIFYICONDATA的

Unity3D定製導航選單

Unity導航選單欄位於遊戲引擎介面的頂部,其中有很多選項且含義各不相同。Unity為開發者提供了導航選單欄的程式介面,使用程式碼可以動態新增選單欄中的選項以及子項。文章出處【狗刨學習網】。 using UnityE

Qt/PyQt的系統托盤圖示(SystemTrayIcon)實現

估計這種小的知識會有幾篇文章,除了全域性快捷鍵部分外,其他的都比較簡單,都是我實現 中碰到的一些小問題,這裡順面整理一下。事實上,稍微懂一點的人,去看看one key code highlighter的原始碼都能明白了。這裡相當於將其詳細的剖析一下。。。。。。。另外,實

Qt視窗最小化到托盤托盤選單控制

  作為Qt初學者,最近在編寫視窗最小化到托盤功能程式碼的時候遇到了點阻礙。 Qt自帶的demo實現的功能太過繁瑣,涉及知識點又太雜,很難理出最核心的思路。網上的文章程式碼也很多脫骨於這個demo,註釋說明太少。 所以自己對比了Qt的demo和網上的文章,自己寫了個簡單的最小化

QtQt密碼框不可選中、複製、貼上、無右鍵選單等【轉】

簡述 在做使用者登入、修改密碼的時候,往往會用到密碼框,其中一些功能要求與普通的輸入框不同,例如:不能選中、複製、貼上、無右鍵選單等功能,當然設定密碼不可見是必須的! 下面介紹兩種方式來實現相同的效果。 簡述 效果 基礎部分 事件過濾器 介面說明 實現方式 事件重

Qt QQ系統表情—實現動態顯示效果

簡述 在Qt 之 QQ系統表情(五) 中 我們實現了自定義系統表情視窗,這一篇將簡單介紹如何實現QQ聊天介面中小表情視窗切換至正常表情視窗的動畫效果。 先看看QQ的效果: 當滑鼠懸浮在表情按鈕之上顯示小表情視窗,點選動態顯示正常表情視窗,再點選隱

定製Android系統開發四——系統服務實現的分析

在上一篇博文中,我給出了實現系統服務的步驟,這篇博文則將分析一下,為什麼這樣的實現方式能夠實現客戶端/伺服器模式。 RadioManagerService 首先來看一下RadioManagerService是如何建立的。 如果我沒有記錯的話,Syste

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

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

自學QT選單按鈕(按鈕選單)即帶有選單的按鈕

這個看起來很高大上呀,其實就是簡單的幾行程式碼而已。 只要把選單給按鈕就行了,要知道按鈕是有setmenu()方法的哦。 程式碼如下: QPushButton *mybtn=new QPushButton("這是一個按鈕"); QMenu *mymenu=new Q

定製Android系統開發三——跟著我實現系統服務

在這篇博文中,我將一步一步建立一個SystemService。 這個系統服務是用於控制收音機的,名字就叫做RadioManagerService。 新建IRadioManager.aidl; 在framework/base/core/java/amdr

Qt選單或者對二級選單的理解.

重點的話寫在前面:我們應該意識到,能點選後實時具體功能的是選單項(和QAction相關),點選之後達到彈出選單項的姑且稱之為"選單"(QMenu). 舉例說明: 解說: 1.管理是Menu. 2.登陸,登出,退出是QAction. 3.二級是Menu. 因為管理是放

定製Android系統開發八——實現從JNI到Java的回撥

前面已經實現了APP->xxxManager->xxxManagerService->jni的函式呼叫,這篇博文就來實現jni->xxxManagerService的回撥。 使用環境 我先說一下我的應用環境吧。我在有一個對裝置節點