【问题标题】:How to access QMainWindow from a QWidget which parent is not QMainWindow如何从父级不是 QMainWindow 的 QWidget 访问 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 似乎不允许自定义构造函数。我想知道这样做的正确方法是什么。

【问题讨论】:

标签: c++ qt qt5 qwidget qmainwindow


【解决方案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 实例)。

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2018-07-13
    • 2021-11-26
    • 2021-12-29
    相关资源
    最近更新 更多