我正在OSX下用Qt5.10 (Qt5.10)编写GUI。我有一个QMainWindow作为主应用程序的窗口。在这里面我有一个QTab小部件,其中我有整个小部件(让我们称它为CaptureTabWidget,它包含一些附加的小部件和一个QFrame (这个QFrame的父函数是QTab)。在最后这个小部件中,我将画一些东西。要点是,我想在statusBar of QMainWindow中编写一些与鼠标在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*,但似乎constructor在提升设计器中的小部件时不允许自定义构造函数。我想知道怎样才是正确的方法。
发布于 2018-01-21 11:15:29
如果您只打算写入父statusBar的QMainWindow,您可以向您的QMainWindow的任何子级发布QStatusTipEvent,并且该事件将一直传播到父QWidget,直到它通过更改状态栏中的内容而到达主窗口。换句话说,在您的QFrame中这样的东西可以完成以下工作:
QCoreApplication::postEvent(this, new QStatusTipEvent("your tip"));
// ^^^^
// assuming this is a pointer to your QFrame object顺便提一下,Qt中的视图(QTableView,QTreeView,QListView,.)中的视图也是这样。能够更改状态提示(当它们的模型为角色Qt::StatusTipRole提供自定义值时),而它们可能被埋在QObject树的深处。
除了写入父类的statusBar之外,我还会尝试通过拥有一个自定义QEvent (即在QEvent::User和QEvent::MaxUser之间有值的QEvent)并在QMainWindow子类中适当地处理该事件来推广上述方法。我发现这种方式比依赖全局变量/单例的其他解决方案更简洁、更易于维护(这些解决方案可以跟踪您所认为的一个QMainWindow实例)。
https://stackoverflow.com/questions/48364464
复制相似问题