Как я правильно реализую, "минимизируют к лотку" функцию в 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();
}
}
Вот как я реализовал "свернуть в трей". Теперь свернуть можно либо двойным щелчком по иконке, либо щелкнув правой кнопкой мыши и выбрав в меню "Show/Hide".