如何在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