翻譯|使用教程|編輯:龔雪|2024-09-13 10:13:49.693|閱讀 107 次
概述:本文將為大家介紹如何使用Qt Widget小部件如何實現(xiàn)一個系統(tǒng)托盤圖標(biāo)示例,歡迎下載最新版組件體驗~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發(fā)工具。它不僅完全實現(xiàn)了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運用于超過70個行業(yè)、數(shù)千家企業(yè),支持?jǐn)?shù)百萬設(shè)備及應(yīng)用。
System Tray Icon(系統(tǒng)托盤圖標(biāo))示例展示了如何將帶有菜單和彈出消息的圖標(biāo)添加到桌面環(huán)境的系統(tǒng)托盤中。
Qt技術(shù)交流群:166830288 歡迎一起進群討論
在上文中(點擊這里回顧>>),我們?yōu)榇蠹医榻B了如何定義Window類,本文將繼續(xù)介紹如何實現(xiàn)Window類。
在構(gòu)建編輯器小部件時,創(chuàng)建實際的系統(tǒng)托盤圖標(biāo)之前,我們首先創(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); }
我們通過將大多數(shù)編輯器的輸入小部件(包括系統(tǒng)托盤圖標(biāo))連接到應(yīng)用程序的專用槽來確保應(yīng)用程序響應(yīng)用戶輸入,但請注意可見性復(fù)選框,它的toggle()信號連接到圖標(biāo)的setVisible()函數(shù)。
void Window::setIcon(int index) { QIcon icon = iconComboBox->itemIcon(index); trayIcon->setIcon(icon); setWindowIcon(icon); trayIcon->setToolTip(iconComboBox->itemText(index)); }
每當(dāng)圖標(biāo)組合框中的當(dāng)前索引發(fā)生變化時,也就是說,每當(dāng)用戶在編輯器中選擇另一個圖標(biāo)時,就會觸發(fā)setIcon()插槽。注意,當(dāng)用戶用鼠標(biāo)左鍵激活托盤圖標(biāo),觸發(fā)圖標(biāo)的()信號時,也會調(diào)用該函數(shù),我們稍后會回到這個信號。
QSystemTrayIcon::setIcon()函數(shù)設(shè)置保存實際系統(tǒng)托盤圖標(biāo)的圖標(biāo)屬性,在Windows上,系統(tǒng)托盤圖標(biāo)的大小是16x16;在X11上,首選的尺寸是22x22,圖標(biāo)將根據(jù)需要縮放到適當(dāng)?shù)拇笮 ?
注意在X11上,由于系統(tǒng)托盤規(guī)范的限制,鼠標(biāo)單擊圖標(biāo)中的透明區(qū)域?qū)鞑サ较到y(tǒng)托盤。如果這種行為是不可接受的,我們建議使用一個沒有透明度的圖標(biāo)。
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: ; } }
每當(dāng)用戶激活系統(tǒng)托盤圖標(biāo)時它都會發(fā)出activated()信號,傳遞觸發(fā)原因作為參數(shù),提供 enum來描述圖標(biāo)是如何被激活的。
在構(gòu)造函數(shù)中,我們將圖標(biāo)的activated()信號連接到自定義的iconActivated()槽:如果用戶使用鼠標(biāo)左鍵單擊了圖標(biāo),該函數(shù)通過增加圖標(biāo)組合框的當(dāng)前索引來改變圖標(biāo)圖像,觸發(fā)如上所述的setIcon()槽。如果用戶使用鼠標(biāo)中鍵激活圖標(biāo),則調(diào)用自定義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); } }
當(dāng)觸發(fā)showMessage()槽時,我們首先根據(jù)當(dāng)前選擇的消息類型檢索消息圖標(biāo)。 enum描述了當(dāng)顯示氣球消息時顯示的圖標(biāo),然后調(diào)用 的()函數(shù),在指定的毫秒時間內(nèi)顯示帶有標(biāo)題、正文和圖標(biāo)的消息。
macOS用戶注意:QSystemTrayIcon::showMessage()顯示消息需要安裝Growl通知系統(tǒng)。
也有相應(yīng)的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?")); }
在構(gòu)造函數(shù)中,我們將messageclick()信號連接到自定義messageclick()插槽,該插槽使用QMessageBox類簡單地顯示一條消息。
QMessageBox提供了一個模態(tài)對話框,其中包含一條短消息、一個圖標(biāo)和根據(jù)當(dāng)前樣式布局的按鈕。它支持四個嚴(yán)重級別:“問題”、“信息”、“警告”和“緊急”。在Qt中彈出消息框最簡單的方法是調(diào)用相關(guān)的靜態(tài)函數(shù)之一,例如QMessageBox::information()。
正如我們前面提到的,重新實現(xiàn)了幾個QWidget的虛函數(shù):
void Window::setVisible(bool visible) { minimizeAction->setEnabled(visible); maximizeAction->setEnabled(!isMaximized()); restoreAction->setEnabled(isMaximized() || !visible); QDialog::setVisible(visible); }
我們的QWidget::setVisible()函數(shù)重新實現(xiàn)在編輯器的外觀發(fā)生變化時更新托盤圖標(biāo)的菜單,例如,在調(diào)用基類實現(xiàn)之前最大化或最小化主應(yīng)用程序窗口。
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(); } }
我們已經(jīng)重新實現(xiàn)了QWidget::closeEvent()事件處理程序來接收小部件關(guān)閉事件,并在用戶關(guān)閉編輯器窗口時向他們顯示上述消息。我們需要避免在用戶真正打算退出應(yīng)用程序時顯示消息并接受關(guān)閉事件:即當(dāng)用戶在菜單欄中觸發(fā)“退出”時,或者在托盤圖標(biāo)的上下文菜單中,或者在macOS上按下Command+Q快捷鍵時。
除了上面討論的函數(shù)和槽,我們還實現(xiàn)了幾個方便的函數(shù)來簡化構(gòu)造函數(shù):createIconGroupBox(), createMessageGroupBox(), createActions()和createTrayIcon(),具體請參見desktop/systray/window.cpp文件。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)