翻譯|使用教程|編輯:龔雪|2024-09-13 10:13:49.693|閱讀 107 次
概述:本文將為大家介紹如何使用Qt Widget小部件如何實現一個系統托盤圖標示例,歡迎下載最新版組件體驗~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發(fā)工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運用于超過70個行業(yè)、數千家企業(yè),支持數百萬設備及應用。
System Tray Icon(系統托盤圖標)示例展示了如何將帶有菜單和彈出消息的圖標添加到桌面環(huán)境的系統托盤中。
Qt技術交流群:166830288 歡迎一起進群討論
在上文中(點擊這里回顧>>),我們?yōu)榇蠹医榻B了如何定義Window類,本文將繼續(xù)介紹如何實現Window類。
在構建編輯器小部件時,創(chuàng)建實際的系統托盤圖標之前,我們首先創(chuàng)建各種編輯器元素:
Window::Window() { createIconGroupBox(); createMessageGroupBox(); iconLabel->setMinimumWidth(durationLabel->sizeHint().width()); createActions(); createTrayIcon(); connect(showMessageButton, &QAbstractButton::clicked, this, &Window::showMessage); connect(showIconCheckBox, &QAbstractButton::toggled, trayIcon, &QSystemTrayIcon::setVisible); connect(iconComboBox, &QComboBox::currentIndexChanged, this, &Window::setIcon); connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &Window::messageClicked); connect(trayIcon, &QSystemTrayIcon::activated, this, &Window::iconActivated); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(iconGroupBox); mainLayout->addWidget(messageGroupBox); setLayout(mainLayout); iconComboBox->setCurrentIndex(1); trayIcon->show(); setWindowTitle(tr("Systray")); resize(400, 300); }
我們通過將大多數編輯器的輸入小部件(包括系統托盤圖標)連接到應用程序的專用槽來確保應用程序響應用戶輸入,但請注意可見性復選框,它的toggle()信號連接到圖標的setVisible()函數。
void Window::setIcon(int index) { QIcon icon = iconComboBox->itemIcon(index); trayIcon->setIcon(icon); setWindowIcon(icon); trayIcon->setToolTip(iconComboBox->itemText(index)); }
每當圖標組合框中的當前索引發(fā)生變化時,也就是說,每當用戶在編輯器中選擇另一個圖標時,就會觸發(fā)setIcon()插槽。注意,當用戶用鼠標左鍵激活托盤圖標,觸發(fā)圖標的()信號時,也會調用該函數,我們稍后會回到這個信號。
QSystemTrayIcon::setIcon()函數設置保存實際系統托盤圖標的圖標屬性,在Windows上,系統托盤圖標的大小是16x16;在X11上,首選的尺寸是22x22,圖標將根據需要縮放到適當的大小。
注意在X11上,由于系統托盤規(guī)范的限制,鼠標單擊圖標中的透明區(qū)域將傳播到系統托盤。如果這種行為是不可接受的,我們建議使用一個沒有透明度的圖標。
void Window::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: case QSystemTrayIcon::DoubleClick: iconComboBox->setCurrentIndex((iconComboBox->currentIndex() + 1) % iconComboBox->count()); break; case QSystemTrayIcon::MiddleClick: showMessage(); break; default: ; } }
每當用戶激活系統托盤圖標時它都會發(fā)出activated()信號,傳遞觸發(fā)原因作為參數,提供 enum來描述圖標是如何被激活的。
在構造函數中,我們將圖標的activated()信號連接到自定義的iconActivated()槽:如果用戶使用鼠標左鍵單擊了圖標,該函數通過增加圖標組合框的當前索引來改變圖標圖像,觸發(fā)如上所述的setIcon()槽。如果用戶使用鼠標中鍵激活圖標,則調用自定義showMessage()槽:
void Window::showMessage() { showIconCheckBox->setChecked(true); int selectedIcon = typeComboBox->itemData(typeComboBox->currentIndex()).toInt(); QSystemTrayIcon::MessageIcon msgIcon = QSystemTrayIcon::MessageIcon(selectedIcon); if (selectedIcon == -1) { // custom icon QIcon icon(iconComboBox->itemIcon(iconComboBox->currentIndex())); trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), icon, durationSpinBox->value() * 1000); } else { trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), msgIcon, durationSpinBox->value() * 1000); } }
當觸發(fā)showMessage()槽時,我們首先根據當前選擇的消息類型檢索消息圖標。 enum描述了當顯示氣球消息時顯示的圖標,然后調用 的()函數,在指定的毫秒時間內顯示帶有標題、正文和圖標的消息。
macOS用戶注意:QSystemTrayIcon::showMessage()顯示消息需要安裝Growl通知系統。
也有相應的messageclick()信號,該信號在用戶單擊showMessage()顯示的消息時發(fā)出。
void Window::messageClicked() { QMessageBox::information(nullptr, tr("Systray"), tr("Sorry, I already gave what help I could.\n" "Maybe you should try asking a human?")); }
在構造函數中,我們將messageclick()信號連接到自定義messageclick()插槽,該插槽使用QMessageBox類簡單地顯示一條消息。
QMessageBox提供了一個模態(tài)對話框,其中包含一條短消息、一個圖標和根據當前樣式布局的按鈕。它支持四個嚴重級別:“問題”、“信息”、“警告”和“緊急”。在Qt中彈出消息框最簡單的方法是調用相關的靜態(tài)函數之一,例如QMessageBox::information()。
正如我們前面提到的,重新實現了幾個QWidget的虛函數:
void Window::setVisible(bool visible) { minimizeAction->setEnabled(visible); maximizeAction->setEnabled(!isMaximized()); restoreAction->setEnabled(isMaximized() || !visible); QDialog::setVisible(visible); }
我們的QWidget::setVisible()函數重新實現在編輯器的外觀發(fā)生變化時更新托盤圖標的菜單,例如,在調用基類實現之前最大化或最小化主應用程序窗口。
void Window::closeEvent(QCloseEvent *event) { if (!event->spontaneous() || !isVisible()) return; if (trayIcon->isVisible()) { QMessageBox::information(this, tr("Systray"), tr("The program will keep running in the " "system tray. To terminate the program, " "choose <b>Quit</b> in the context menu " "of the system tray entry.")); hide(); event->ignore(); } }
我們已經重新實現了QWidget::closeEvent()事件處理程序來接收小部件關閉事件,并在用戶關閉編輯器窗口時向他們顯示上述消息。我們需要避免在用戶真正打算退出應用程序時顯示消息并接受關閉事件:即當用戶在菜單欄中觸發(fā)“退出”時,或者在托盤圖標的上下文菜單中,或者在macOS上按下Command+Q快捷鍵時。
除了上面討論的函數和槽,我們還實現了幾個方便的函數來簡化構造函數:createIconGroupBox(), createMessageGroupBox(), createActions()和createTrayIcon(),具體請參見desktop/systray/window.cpp文件。
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網