如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

Posted

技术标签:

【中文标题】如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow【英文标题】:How to access QMainWindow from a QWidget which parent is not QMainWindow 【发布时间】:2018-01-21 07:04:54 【问题描述】:

我正在 OSX 下使用 Qt Creator (Qt5.10) 编写 GUI。我有一个QMainWindow 用于主应用程序的窗口。在这里面我有一个QTab 小部件,其中我有整个小部件(我们称之为CaptureTabWidget,它包含一些额外的小部件和一个QFrame(这个QFrame 的父级是QTab)。在这个最后一个小部件我会画一些东西。关键是我想在QMainWindowstatusBar 中写一些与鼠标位置相关的值在QFrame 中,但我不知道关于如何从包含QFrameCaptureTabWidget 中的方法访问主窗口。

整个画面是这样的:

                 X
+-----------+  XXX
|MainWindow | XXXXXXXXX
+-----+-----+  XXX    XXXXXX
      |          X         XXX
+-----v------------+          XX
|QTabWidget        |           XX
|No parent         |            XX
+-----+------------+             XX
      |                           X
+-----v-------------+          ?? X
|CaptureTabQWidget  |             X
|Parent:QTabWidget  |             X
+-----+-------------+            X
      |                         X
+-----v-------------+         XX
|QFrame             |    XXXXXX
|Parent:CaptureTab  | XXX
+-------------------+

我尝试修改 CaptureTabWidget 的构造函数以接收指向主窗口的QMainWindow*,但在设计器中提升小部件时,Qt Creator 似乎不允许自定义构造函数。我想知道这样做的正确方法是什么。

【问题讨论】:

这个工作justcheckingonall.wordpress.com/2013/11/27/get-mainwindow-qt 吗? QT/C++ - Accessing MainWindow UI from a different class的可能重复 感谢您的反馈。是的,我看到了那个解决方案,我只是想知道是否有一种优雅的方法可以做到这一点,因为我不是经验丰富的 Qt 程序员。我再等一会儿,否则我会把你给我的文章标记为解决方案。 【参考方案1】:

如果您只是想写信给父QMainWindowstatusBar,您可以将QStatusTipEvent 发布给您QMainWindow 的任何子,该事件将继续传播给父QWidgets直到它到达通过更改状态栏中的内容来处理它的主窗口。换句话说,QFrame 中的类似内容可以完成这项工作:

QCoreApplication::postEvent(this, new QStatusTipEvent("your tip"));
//                          ^^^^
//                          assuming this is a pointer to your QFrame object

附带说明,这与 Qt 中的视图(QTableViewQTreeViewQListView、...)能够更改状态提示的方式相同(当它们的模型为角色提供自定义值时) Qt::StatusTipRole) 虽然它们可能被深埋在 QObject 树的深处......


除了写给父母QMainWindowstatusBar 之外,我会尝试通过自定义QEvent 来概括上述方法(即,值介于QEvent::User 和@987654339 之间的值) @) 并在我的 QMainWindow 子类中适当地处理该事件。我发现这种方式比其他依赖于全局变量/单例的解决方案更清洁、更易于维护(跟踪你所谓的一个 QMainWindow 实例)。

【讨论】:

以上是关于如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow的主要内容,如果未能解决你的问题,请参考以下文章

如何从父级修改组件的样式?

数据未在 VueJS 中使用提供/注入从父级注入到子级

如何从父级运行子函数?

如何从父级中删除 QObject

Fancybox iframe 内容 - 如何从父级访问 CSS?

如何使引导树视图从父级折叠到子级?