如何在Qt中正确实现"最小化到托盘"功能?
-
29-09-2020 - |
题
如何在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);
}
其他提示
除了Jake Petroules所说的之外,似乎只是在做:
QTimer::singleShot(0, this, SLOT(hide()));
够了。从 http://qt-project.org/doc/qt-4.8/qtimer.html#details :
作为一个特例,一个
QTimer
超时为0
一旦窗口系统的事件队列中的所有事件都处理完毕,就会超时。
这样您就不会有选择适当延迟值的问题。..
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();
}
}
这就是我实现"最小化到托盘"的方式。您现在可以通过双击图标或右键单击并在菜单中选择"显示/隐藏"来最小化。
我发现 showMinimized()
插槽工作没有QTimer延迟,所以你可以使用代码,如:
mw->show();
if ( qApp->arguments().contains( "--startHidden" ) )
mw->showMinimized();
在你的 main()
要显示一个主窗口,并立即图标化它,当需要。
不隶属于 StackOverflow