Wie kann ich ‚immer oben‘ wechseln für einen QMainWindow in Qt ohne ein Flackern oder einen Blitz verursacht?

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

  •  27-09-2019
  •  | 
  •  

Frage

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

Die obige Lösung funktioniert, aber da setWindowFlags versteckt das Fenster, muss es wieder gezeigt und natürlich sein, die nicht sehr elegant aussehen. So wie ich „immer oben“ für eine QMainWindow ohne dass „Flashen“ Nebenwirkung umschalten?

War es hilfreich?

Lösung

sagt nein :

Es ist nicht möglich, Änderungen an den Fensterfahnen zu machen, wenn das Fenster, ohne dass Flimmern erzeugt wurde. Flicker ist unvermeidbar, da die Fenster Bedürfnisse neu erstellt werden.

Aber manchmal, wenn Sie stecken mit einem blinkenden Effekt, wie diese Art von hässlich ist, können Sie absichtlich es in die Länge ziehen, um es wie etwas zu machen scheinen, „cool“ gerade passiert ist.

Vielleicht einen wenig Fortschrittsbalken Pop-up, die nicht im Fenster ist, sagen Sie „Anpassen Fenstereigenschaften“ ... verblasst das Fenster aus der Existenz und dann zurück in und in der Nähe der Fortschrittsbalken Popup.

Andere Tipps

Nun, für eine Lösung, die ich dachte, ich in den Mono-Quellen aussehen würde, da ich die .NET-Form-Klasse (System.Windows.Forms) weiß, hat eine TopMost Eigenschaft.

Die Lösung, die ich für mein Qt-Programm gefunden wurde:

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
}

Getestet mit

  • Qt 5.2.1 auf Windows XP
  • Qt 5.2 auf 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();
    }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top