如何从父级不是 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
)。在这个最后一个小部件我会画一些东西。关键是我想在QMainWindow
的statusBar
中写一些与鼠标位置相关的值在QFrame
中,但我不知道关于如何从包含QFrame
的CaptureTabWidget
中的方法访问主窗口。
整个画面是这样的:
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】:如果您只是想写信给父QMainWindow
的statusBar
,您可以将QStatusTipEvent
发布给您QMainWindow
的任何子,该事件将继续传播给父QWidget
s直到它到达通过更改状态栏中的内容来处理它的主窗口。换句话说,QFrame
中的类似内容可以完成这项工作:
QCoreApplication::postEvent(this, new QStatusTipEvent("your tip"));
// ^^^^
// assuming this is a pointer to your QFrame object
附带说明,这与 Qt 中的视图(QTableView
、QTreeView
、QListView
、...)能够更改状态提示的方式相同(当它们的模型为角色提供自定义值时) Qt::StatusTipRole
) 虽然它们可能被深埋在 QObject
树的深处......
除了写给父母QMainWindow
的statusBar
之外,我会尝试通过自定义QEvent
来概括上述方法(即,值介于QEvent::User
和@987654339 之间的值) @) 并在我的 QMainWindow
子类中适当地处理该事件。我发现这种方式比其他依赖于全局变量/单例的解决方案更清洁、更易于维护(跟踪你所谓的一个 QMainWindow
实例)。
【讨论】:
以上是关于如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow的主要内容,如果未能解决你的问题,请参考以下文章