在父级之上的无模式Qt窗口,但不在其他应用程序之上

rrw*_*ick 5 user-interface qt window

我希望有一个Qt对话框窗口:

  1. 始终位于其父项(应用程序主窗口)的顶部,
  2. 允许用户与父窗口进行交互,以及
  3. 并不总是处于其他应用程序之上。

通过将对话框设置为模态,我已经可以实现1和3,并且可以通过使用Qt :: WindowStaysOnTopHint窗口标志来实现1和2。但是我无法使所有这三个都起作用-可能吗?

如果答案是特定于操作系统的,则我主要在Mac上工作,但我更喜欢也适用于Windows和Linux的解决方案。谢谢!

Fel*_*lix 3

你可以尝试使用QGuiApplication::applicationStateChanged. 这样,如果用户进入或离开您的应用程序,您就会收到通知。只需动态添加和删除Qt::WindowStaysOnTopHint窗口的标志即可。如果您有多个窗口,可以QGuiApplication::focusWindowChanged与第一个窗口一起使用。

编辑:要使对话框成为非模式对话框,请设置NULL为它的父级,或者将 windowModality-Property 设置为并使用and not或Qt::NonModal显示对话框showopenexec

QDialog 子类中的示例代码:

connect(QApplication::instance(), SIGNAL(applicationStateChanged(Qt::ApplicationState)), this, SLOT(changeAlwaysOnTop(Qt::ApplicationState)));

...

void MyDialog::changeAlwaysOnTop(Qt::ApplicationState state)
{
    if (state == Qt::ApplicationActive)
        setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
    else
        setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint);
    show();
}
Run Code Online (Sandbox Code Playgroud)