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

4

4 に答える 4

20

ノキアはノーと言います

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

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

ウィンドウにない小さなプログレス バーをポップアップ表示して、「ウィンドウのプロパティを調整中!」と言うと、ウィンドウがフェードアウトしてから元に戻り、プログレス バーのポップアップが閉じます。

于 2010-05-18T09:41:20.773 に答える
20

.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
}
于 2010-05-18T20:12:40.787 に答える