2010-07-26 28 views
14

如何在Qt中正確實現「最小化托盤」功能?如何在Qt中正確實現「最小化托盤」功能?

我試過QMainWindow::changeEvent(QEvent *e)裏面的下面的代碼,但窗口只是最小化到任務欄,並且客戶區在恢復時顯示爲空白。

if (Preferences::instance().minimizeToTray()) 
{ 
    e->ignore(); 
    this->setVisible(false); 
} 

試圖忽略事件似乎也沒有做任何事情。

+1

從個人的經驗,我已經學會了,你平時不想要這個。托盤不是最小化應用的地方。托盤_is_是監視事件(藍牙,網絡狀態,這類東西)的applet的正確位置。如果你的應用程序包含這種功能,那麼在自己的過程中拆分該部分可能是明智的。這個輔助過程將會始終出現在托盤中,而其他任何地方都會出現。 – MSalters 2010-07-26 08:37:02

+3

雖然有些用戶喜歡這個功能。在我的應用程序中,它不是默認行爲,但在首選項對話框中顯示爲一個選項。我認爲這種平衡正確的設計和用戶偏好。 – 2010-07-27 07:22:58

回答

17

顯然需要一個小的延遲來處理其他事件(也許有人會發布確切的細節?)。下面是我落得這樣做,這完美的作品:

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); 
} 
+0

有趣的事實,它需要延遲工作,但非常有用:)想知道是否有一個」更清潔「的解決方案雖然..但我會嘗試你的代碼,也:) – Exa 2010-07-26 09:45:26

+0

嗨即時通訊嘗試這個並獲得錯誤「首選項」尚未宣佈? – GeneCode 2017-09-15 04:27:57

7
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(); 
    } 
} 

這就是我如何實現「最小化托盤」。您現在可以通過雙擊圖標或通過右鍵單擊並選擇菜單中的「顯示/隱藏」來最小化。

+0

謝謝,但我特意尋找一種方法來隱藏窗口,當用戶最小化它。 ;) – 2010-07-26 07:07:38

+0

啊好吧,對不起,你錯了:)所以現在這只是一個示例,需要帶有顯示/隱藏功能的工作圖標:) – Exa 2010-07-26 07:30:03

+0

+1代表一個不錯的代碼! – Narek 2010-07-26 19:04:43

11

除了什麼傑克Petroules說,看來,簡單地做:

QTimer::singleShot(0, this, SLOT(hide())); 

就足夠了。從http://qt-project.org/doc/qt-4.8/qtimer.html#details

作爲一個特殊的情況下,將0超時將盡快在窗口系統中的事件隊列中的所有事件被處理超時一個QTimer

這樣你就不必選擇合適的延遲值的問題...

相關問題