2010-07-26 87 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

这样你就不必选择合适的延迟值的问题...