web-dev-qa-db-ja.com

ちらつきやフラッシュを発生させずに、QtのQMainWindowの「常に上」を切り替えるにはどうすればよいですか?

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の「常に上」に切り替えるにはどうすればよいですか?

23
Jake Petroules

ノキア ノーと言う

ウィンドウが作成されると、ちらつきを発生させずにウィンドウフラグを変更することはできません。ウィンドウを再作成する必要があるため、ちらつきは避けられません。

しかし、このような醜い点滅効果で立ち往生している場合は、意図的にドラッグして、何か「クール」なことが起こったように見せることができます。

たぶん、ウィンドウにない小さなプログレスバーをポップアップして、「ウィンドウのプロパティを調整しています!」と言ってください...ウィンドウをフェードアウトしてから元に戻し、プログレスバーのポップアップを閉じます。

.NETフォームクラス(System.Windows.Forms)にTopMostプロパティがあることがわかっているので、解決策として、Monoソースを調べることにしました。

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
}
17
Jake Petroules