Как я переключаюсь 'поверх остальных окон' для QMainWindow в QT, не вызывая мерцание или флэш-память?

void MainWindow::on_actionAlways_on_Top_triggered(bool checked)
{
    Qt::WindowFlags flags = this->windowFlags();
    if (checked)
    {
        this->setWindowFlags(flags | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
        this->show();
    }
    else
    {
        this->setWindowFlags(flags ^ (Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint));
        this->show();
    }
}

Вышеупомянутое решение работает, но потому что setWindowFlags скрывает окно, это нужно повторно показать и конечно который не выглядит очень изящным. Таким образом, как я переключаюсь "поверх остальных окон" для QMainWindow без того побочного эффекта "высвечивания"?

22
задан zeFree 15 November 2013 в 00:12
поделиться

2 ответа

Nokia говорит «нет» :

Невозможно изменить флаги окна после того, как оно было создано, не вызывая мерцания. Мерцание неизбежно, так как окно нужно воссоздавать.

Но иногда, если вы сталкиваетесь с мерцающим эффектом, который выглядит некрасиво, вы можете намеренно вытащить его, чтобы он выглядел как что-то «крутое».

Может быть, появится небольшая полоса прогресса, которой нет в окне, скажем «Настройка свойств окна!» ... исчезнет окно, а затем снова появится, и закроется всплывающее окно индикатора выполнения.

19
ответ дан 29 November 2019 в 05:10
поделиться

Что ж, я решил поискать решение в исходниках Mono, поскольку я знаю, что класс .NET Form (System.Windows.Forms) имеет свойство TopMost.

Я нашел решение для своей программы Qt:

void MainWindow::on_actionAlways_on_Top_triggered(bool checked)
{
#ifdef Q_OS_WIN
    // #include <windows.h>
    if (checked)
    {
        SetWindowPos(this->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    }
    else
    {
        SetWindowPos(this->winId(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    }
#else
    Qt::WindowFlags flags = this->windowFlags();
    if (checked)
    {
        this->setWindowFlags(flags | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
        this->show();
    }
    else
    {
        this->setWindowFlags(flags ^ (Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint));
        this->show();
    }
#endif
}
16
ответ дан 29 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

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