Comment puis-je basculer « toujours au-dessus » pour un QMainWindow dans Qt sans provoquer un scintillement ou un flash?

StackOverflow https://stackoverflow.com/questions/2855968

  •  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 »?

Était-ce utile?

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();
    }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top