如何在Qt中正確實現「最小化托盤」功能?如何在Qt中正確實現「最小化托盤」功能?
我試過QMainWindow::changeEvent(QEvent *e)
裏面的下面的代碼,但窗口只是最小化到任務欄,並且客戶區在恢復時顯示爲空白。
if (Preferences::instance().minimizeToTray())
{
e->ignore();
this->setVisible(false);
}
試圖忽略事件似乎也沒有做任何事情。
如何在Qt中正確實現「最小化托盤」功能?如何在Qt中正確實現「最小化托盤」功能?
我試過QMainWindow::changeEvent(QEvent *e)
裏面的下面的代碼,但窗口只是最小化到任務欄,並且客戶區在恢復時顯示爲空白。
if (Preferences::instance().minimizeToTray())
{
e->ignore();
this->setVisible(false);
}
試圖忽略事件似乎也沒有做任何事情。
顯然需要一個小的延遲來處理其他事件(也許有人會發布確切的細節?)。下面是我落得這樣做,這完美的作品:
void MainWindow::changeEvent(QEvent* e)
{
switch (e->type())
{
case QEvent::LanguageChange:
this->ui->retranslateUi(this);
break;
case QEvent::WindowStateChange:
{
if (this->windowState() & Qt::WindowMinimized)
{
if (Preferences::instance().minimizeToTray())
{
QTimer::singleShot(250, this, SLOT(hide()));
}
}
break;
}
default:
break;
}
QMainWindow::changeEvent(e);
}
void main_window::create_tray_icon()
{
m_tray_icon = new QSystemTrayIcon(QIcon(":/icon.png"), this);
connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_show_hide(QSystemTrayIcon::ActivationReason)));
QAction *quit_action = new QAction("Exit", m_tray_icon);
connect(quit_action, SIGNAL(triggered()), this, SLOT(on_exit()));
QAction *hide_action = new QAction("Show/Hide", m_tray_icon);
connect(hide_action, SIGNAL(triggered()), this, SLOT(on_show_hide()));
QMenu *tray_icon_menu = new QMenu;
tray_icon_menu->addAction(hide_action);
tray_icon_menu->addAction(quit_action);
m_tray_icon->setContextMenu(tray_icon_menu);
m_tray_icon->show();
}
void main_window::on_show_hide(QSystemTrayIcon::ActivationReason reason)
{
if(reason)
{
if(reason != QSystemTrayIcon::DoubleClick)
return;
}
if(isVisible())
{
hide();
}
else
{
show();
raise();
setFocus();
}
}
這就是我如何實現「最小化托盤」。您現在可以通過雙擊圖標或通過右鍵單擊並選擇菜單中的「顯示/隱藏」來最小化。
除了什麼傑克Petroules說,看來,簡單地做:
QTimer::singleShot(0, this, SLOT(hide()));
就足夠了。從http://qt-project.org/doc/qt-4.8/qtimer.html#details:
作爲一個特殊的情況下,將
0
超時將盡快在窗口系統中的事件隊列中的所有事件被處理超時一個QTimer
。
這樣你就不必選擇合適的延遲值的問題...
從個人的經驗,我已經學會了,你平時不想要這個。托盤不是最小化應用的地方。托盤_is_是監視事件(藍牙,網絡狀態,這類東西)的applet的正確位置。如果你的應用程序包含這種功能,那麼在自己的過程中拆分該部分可能是明智的。這個輔助過程將會始終出現在托盤中,而其他任何地方都會出現。 – MSalters 2010-07-26 08:37:02
雖然有些用戶喜歡這個功能。在我的應用程序中,它不是默認行爲,但在首選項對話框中顯示爲一個選項。我認爲這種平衡正確的設計和用戶偏好。 – 2010-07-27 07:22:58