Comment puis-je basculer « toujours au-dessus » pour un QMainWindow dans Qt sans provoquer un scintillement ou un flash?
-
27-09-2019 - |
Question
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();
}
}
Les travaux de solution ci-dessus, mais parce que setWindowFlags cache la fenêtre, il doit être re-montre et bien sûr qui ne semble pas très élégant. Alors, comment puis-je basculer « toujours au-dessus » pour une QMainWindow sans cet effet secondaire « clignotant »?
La solution
Nokia dit pas :
Il est impossible de modifier les drapeaux de la fenêtre une fois que la fenêtre a été créée sans provoquer le scintillement. Flicker est inévitable puisque les besoins de la fenêtre à recréés.
Mais parfois, si vous êtes coincé avec un effet clignotant qui est un peu laid comme ça, vous pouvez intentionnellement traîner les choses à faire croire que quelque chose « cool » vient de se passer.
pop Peut-être un peu barre de progression qui est pas dans la fenêtre, dites « Réglage des propriétés de la fenêtre! » ... fanent la fenêtre hors de l'existence, puis de nouveau dans et près de la barre de progression pop-up.
Autres conseils
Eh bien, pour une solution je me suis dit que je regarde dans les sources Mono, car je sais que la classe Form .NET (System.Windows.Forms) possède une propriété TopMost.
La solution que je trouve mon programme Qt était:
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
}
Testé avec
- Qt 5.2.1 sur Windows XP
- Qt 5.2 sur OS X 10.9
void ConsoleUI::onAllwaysTop(bool checked) { Qt::WindowFlags flags = windowFlags(); if (checked) { flags ^= Qt::WindowStaysOnBottomHint; flags |= Qt::WindowStaysOnTopHint; } else { flags ^= Qt::WindowStaysOnTopHint; flags |= Qt::WindowStaysOnBottomHint; } setWindowFlags(flags); show(); }