Как я правильно реализую, “минимизируют к лотку” функцию в QT?

Как я правильно реализую, "минимизируют к лотку" функцию в QT?

Я попробовал следующий код внутри QMainWindow::changeEvent(QEvent *e), но окно просто минимизирует к панели задач, и клиентская область появляется пустой белый при восстановлении.

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

Попытка проигнорировать событие, кажется, ничего не делает, также.

16
задан Jake Petroules 26 July 2010 в 04:46
поделиться

2 ответа

По-видимому, требуется небольшая задержка для обработки других событий (возможно, кто-то опубликует точные детали?). Вот что я в итоге сделал и отлично работает:

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);
}
17
ответ дан 30 November 2019 в 16:57
поделиться
 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".

7
ответ дан 30 November 2019 в 16:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: