如何在Qt中正确实现"最小化托盘"功能?

Jak*_*les 16 c++ qt window-managers

如何在Qt中正确实现"最小化托盘"功能?

我在里面尝试了以下代码QMainWindow::changeEvent(QEvent *e),但是窗口只是最小化到任务栏,并且客户端区域在恢复时显示为空白.

if (Preferences::instance().minimizeToTray())
{
    e->ignore();
    this->setVisible(false);
}
Run Code Online (Sandbox Code Playgroud)

试图忽略该事件似乎也没有做任何事情.

Jak*_*les 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);
}
Run Code Online (Sandbox Code Playgroud)


Man*_*bes 11

除了Jake Petroules所说的,它似乎只是做:

QTimer::singleShot(0, this, SLOT(hide()));
Run Code Online (Sandbox Code Playgroud)

足够.来自http://qt-project.org/doc/qt-4.8/qtimer.html#details:

作为一种特殊情况,只要处理了窗口系统事件队列中的所有事件,QTimer超时0将超时.

这样你就没有选择合适的延迟值的问题了......


Exa*_*Exa 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我如何实现"最小化托盘".您现在可以通过双击图标或右键单击并在菜单中选择"显示/隐藏"来最小化.

  • +1代表一段很好的代码,但你的"connect(hide_action,SIGNAL(triggered()),this,SLOT(on_show_hide()));" 有点不对劲.如果你在调试模式下运行你的Qt应用程序,你应该看到类似的东西:"QObject :: connect:没有这样的插槽on_show_hide()......"你不能使用相同的"on_show_hide(QSystemTrayIcon :: ActivationReason reason)"插槽比如"on_show_hide()" (2认同)