如何在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() 要显示一个主窗口,并立即图标化它,当需要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top