更改 QWidget 的标志的问题

Posted

技术标签:

【中文标题】更改 QWidget 的标志的问题【英文标题】:Problems changing the flags of a QWidget 【发布时间】:2018-02-27 09:04:33 【问题描述】:

我的应用程序中有一个 QWidget 作为另一个 QWidget 的子级。该任务包括将内部小部件置于全屏模式,并能够在正常模式下使用相同的按钮再次看到它。这部分是我设法通过以下方式做到的:

if(!isFullScreen())

   setWindowFlags(windowFlags() | Qt::Window);
   showFullScreen();

else

   setWindowFlags(windowFlags() & ~Qt::Window);
   showNormal();
   activateWindow();

当您返回以正常模式查看小部件时会出现问题。发生的事情:

鼠标光标与指向手形光标保持一致。

改变模式的按钮保持悬停状态(鼠标悬停时改变背景颜色)

通过其他小部件控件传递鼠标不会改变其外观

我必须单击小部件来修复该行为。就好像小部件没有收到任何类型的事件或类似的事件。我尝试调用 setFocus () 并没有用。我也尝试通过以下方式手动发送事件,但也没有成功:

QMouseEvent my_event(QEvent::MouseButtonPress, QPointF (0, 0), Qt :: NoButton, 0, 0);
QApplication::sendEvent(this, & my_event);

有什么想法吗?

谢谢。

【问题讨论】:

【参考方案1】:

无法使用 Qt5.9.4 在 Xubuntu 上重现您的问题。

但是,我在上一份工作中做了同样的事情,并且在所有平台上都能正常工作。我认为是这样的:

if(!isFullScreen())

    setParent(0);
    showFullScreen();

else

    orignalParentLayout->addWidget(this); // better: insert at correct position
    showNormal();

为此,您必须添加一些关于父级布局的知识。您可以尝试在进入全屏模式之前检测该信息,但这可能不值得。

你也可以试试:

if(!isFullScreen())

    logicalParent = parentWidget();
    setParent(0);
    showFullScreen();

else

    setParent(logicalParent);
    showNormal();

如果您没有布局。您可能还想在全屏显示之前存储几何图形。

【讨论】:

首先,感谢您的回答。我发现您的解决方案的问题是,如果您从小部件中删除父级,则会在应用程序环境之外创建一个新窗口。我想要的是类似于 Word 的“打印预览”的行为,例如,我的应用程序中的全屏模式。 附加窗口将全屏显示或根本不存在。但这与您的代码相同,只是您欺骗 Qt 将其视为窗口,而我将其干净地移出并移回对象结构中。 使用我的代码,全屏窗口位于应用程序的环境中,但是,使用您的解决方案,例如从 Alt + Tab 选项创建一个新的可导航窗口,这不是我想要的 对我来说,你的也是。您可以尝试使用 setWindowFlags(Qt::Tool); 之类的东西,它将它从 Alt+Tab 中隐藏起来。虽然它仍然是一个单独的窗口,但两者都可以访问。如果您实际上真的只有一个窗口,请隐藏原始窗口或将小部件作为最顶层的不透明覆盖小部件添加到顶层窗口并以全屏模式显示。有点创意。

以上是关于更改 QWidget 的标志的问题的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 样式表用于 QWidget 的孩子更改 QWidget

更改 QGridLayout 中单个 QWidget 的间距

无法从 QWidget 更改 QSlider 的值

在 Qt 4.8.0 中使用 QGlWidget 更改 QWidget

如何在半透明的 QWidget 上播放视频?

如何使用 Qt::CustomizeWindowHint 禁用 QWidget 的拖动?