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 без того побочного эффекта "высвечивания"?
Nokia говорит «нет» :
Невозможно изменить флаги окна после того, как оно было создано, не вызывая мерцания. Мерцание неизбежно, так как окно нужно воссоздавать.
Но иногда, если вы сталкиваетесь с мерцающим эффектом, который выглядит некрасиво, вы можете намеренно вытащить его, чтобы он выглядел как что-то «крутое».
Может быть, появится небольшая полоса прогресса, которой нет в окне, скажем «Настройка свойств окна!» ... исчезнет окно, а затем снова появится, и закроется всплывающее окно индикатора выполнения.
Что ж, я решил поискать решение в исходниках 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
}