18

Qtで「トレイに最小化」機能を適切に実装するにはどうすればよいですか?

内で次のコードを試しましたQMainWindow::changeEvent(QEvent *e)が、ウィンドウがタスクバーに最小化されるだけで、復元するとクライアント領域が真っ白に表示されます。

if (Preferences::instance().minimizeToTray())
{
    e->ignore();
    this->setVisible(false);
}

イベントを無視しようとしても、何もしないようです。

4

4 に答える 4

19

明らかに、他のイベントを処理するために少し遅れが必要です (誰かが正確な詳細を投稿するのではないでしょうか?)。これが私がやったことで、完全に機能します:

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);
}
于 2010-07-26T08:04:23.187 に答える
11

Jake Petroules の発言に加えて、単純に次のことを行っているようです。

QTimer::singleShot(0, this, SLOT(hide()));

で十分です。http://qt-project.org/doc/qt-4.8/qtimer.html#detailsから:

特殊なケースとして、QTimerタイムアウトが の0は、ウィンドウ システムのイベント キュー内のすべてのイベントが処理されるとすぐにタイムアウトします。

このようにして、適切な遅延値を選択するという問題はありません...

于 2011-05-23T08:46:35.403 に答える
8
 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();
    }
}

それが「トレイへの最小化」を実現する方法です。アイコンをダブルクリックするか、右クリックしてメニューの「表示/非表示」を選択すると、最小化できるようになりました。

于 2010-07-26T05:51:32.657 に答える