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