【发布时间】:2021-01-19 08:23:38
【问题描述】:
我正在开发 Qt 应用程序。我有 QMainWindow 和 QWidget,它们独立显示在窗口外。
我想实现,如果我点击那个 QWidget,窗口就不会出现在前面。即如果它在另一个应用程序后面,它应该保持这样。
我已经创建了测试应用:
main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow w;
w.show();
Widget mywidget;
return app.exec();
}
Widget.cpp
namespace
{
Qt::WindowFlags defaultWindowFlags()
{
Qt::WindowFlags f = 0;
f |= Qt::X11BypassWindowManagerHint;
f |= Qt::FramelessWindowHint;
f |= Qt::WindowStaysOnTopHint;
f |= Qt::CustomizeWindowHint;
f |= Qt::WindowDoesNotAcceptFocus;
f |= Qt::Window;
return f;
}
}
Widget::Widget(QWidget *parent) : QWidget(parent, defaultWindowFlags())
{
setFixedSize(100,100);
setStyleSheet("background-color:blue;");
move(56,89);
setVisible(true);
}
【问题讨论】:
-
我想实现,如果我点击那个 QWidget,窗口就不会出现在最前面。 我知道某些 X11 窗口管理器会这样做—— the-box(或者可以配置为这样做)。我们在 Windows 上遇到过类似的事情,最后放弃了。在 Windows 中管理堆栈(使用纯 Qt 解决方案)对我来说似乎是一个难题。要在您的问题上取得进展,edit 并提及您的目标平台可能会有所帮助。
-
我刚刚制作了一个 MCVE 并在 Windows 上进行了测试。一个瞬态的
QDialog(以主要胜利为父)总是在主要胜利之上。并带来了主要的胜利。单击时到前面。非瞬态QDialog(没有父窗口)是一个独立窗口。单击它会将其置于顶部,而不会更改主要胜利的当前堆叠级别。我看到你也构造了Widget mywidget;没有父窗口。所以,你可能不在 Windows 上(它应该在哪里工作)。 (f |= Qt::X11BypassWindowManagerHint;让我更加相信这一点。)我想这可能与您的特定窗口管理器有关... -
@Scheff 对不起,我忘了提。我在 MacOS 平台上
-
当您单击小部件时,我无法重现出现在顶部的 MainWindow。只有关闭小部件才能将 MainWindow 带到顶部。 (Mac OS 10.15.7, Qt 5.15.0)
-
@Jens 你能分享你正在使用的代码吗?我已经使用 Qt 5.15.0 和 MacOS Catalina 10.15.7 进行了尝试,当我单击小部件时,QMainWindow 出现在前面。我想将您的代码与我的代码进行比较,看看有什么不同
标签: macos qt qt5 qwidget qmainwindow