点击独立QWidget时如何避免将QMainWindow置于前端

3

我正在开发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 窗口管理器可以自动完成此操作(或可以进行配置)。我们在 Windows 上遇到了类似的问题,最终放弃了。对我来说,在 Windows 上使用纯 Qt 解决方案管理堆栈似乎是一个困难的话题。为了推进您的问题,编辑并提及您的目标平台可能会有所帮助。 - Scheff's Cat
我刚刚制作了一个MCVE并在Windows上进行了测试。一个短暂的QDialog(以主窗口为父窗口)始终位于主窗口顶部,并在单击时将主窗口置于前台。一个非短暂的QDialog(没有父窗口)是一个独立的窗口。单击它会将其置于顶部,而不改变主窗口的当前堆叠级别。我看到你也构建了没有父窗口的Widget mywidget;。所以,你可能不在Windows上(在那里它应该可以工作)。(f |= Qt::X11BypassWindowManagerHint; 让我更加相信这一点。) 我猜这可能与你特定的窗口管理器有关... - Scheff's Cat
@Scheff 抱歉,我忘了提到。我使用的是MacOS平台。 - RuLoViC
当您单击小部件时,我无法重现MainWindow置顶的情况。只有关闭小部件才会将MainWindow置顶。(Mac OS 10.15.7,Qt 5.15.0) - Jens
@Jens,你能分享一下你正在使用的代码吗?我已经尝试了在Qt 5.15.0和MacOS Catalina 10.15.7上运行它,但当我点击widget时,QMainWindow会出现在前面。我想比较一下你的代码和我的,看看有什么不同之处。 - RuLoViC
区别在于缺少defaultWindowFlags()方法。我测试了每个标志的效果,并在下面的答案中发布了我的发现。 - Jens
1个回答

2
留下这行代码 f |= Qt::WindowDoesNotAcceptFocus;,这会使Qt保持焦点在主窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接