Qt 设计师:嵌套的小部件不是成员吗?

Posted

技术标签:

【中文标题】Qt 设计师:嵌套的小部件不是成员吗?【英文标题】:Qt designer: nested widget is not a member? 【发布时间】:2014-11-23 13:55:25 【问题描述】:

我正在使用 Qt Creator 3.2.1。 我使用 Qt Designer 进行了基本设计:通过添加一个普通的 QWidget 并将其提升到我的自定义窗口中,我向我的 主窗口 添加了一个自定义小部件 (CustomWidget 小部件)。 在那个自定义小部件中,我添加了一个 QGraphicsView(QGraphicsView 视图)。

Qt Designer的对象浏览器正确显示项目的层次结构:widget中的viewmainwindow中的widget em>。

但是,表单生成的 ui_mainwindow.h 给了我:

// in ui_mainwindow.h
class Ui_MainWindow

public:
    CustomWidget *widget;
    QGraphicsView *view;
    // ...
;

当我真正期待时:

// in ui_mainwindow.h
class Ui_MainWindow

public:
    CustomWidget *widget;
    // ...
;

// in customwidget.h
class CustomWidget

public:
    QGraphicsView *view;
    // ...
;

另一个小部件的嵌套小部件不应该是它的成员吗?

如何在 Qt Designer 中调整我的类设计以使 view 成为 widget 的成员?

【问题讨论】:

【参考方案1】:

Qt 中,用于定义小部件层次结构的规则不是包含而是父级。如果widget2widget1 的父级,则WidgetType1 类型的WidgetType1 将被绘制在widget2 中,如果WidgetType2 包含WidgetType2 类型的成员则不会。 widget2 可以通过在widget2 的构造函数中传递widget2 作为父级或使用widget2.setParent(widget1); 来设置widget1 的父级。布局也可以定义Parent/child 层次结构。

是的,您可以拥有包含和定义其他对象的对象类型,但是如果您不将this 作为父对象传递给成员对象,则成员对象将不会被绘制在容器类类型小部件中。

在你的情况下,不需要有多个类,你只需要将你想成为容器的对象作为你想成为孩子的对象的父对象。有关更多信息,我建议阅读Layout Management 和Object Trees & Ownership 的Qt 文档。

【讨论】:

感谢您的回答。小部件绘图没有问题。问题是 Qt Designer 不包含嵌套小部件到父小部件中,这在我看来是有意义的。您想创建多个 CustomWidget 实例的映像。将 QGraphicsView *view 包含在其中更有意义。

以上是关于Qt 设计师:嵌套的小部件不是成员吗?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 设计器和 Dock 小部件

使用 qt 设计器创建的主应用程序中不会出现升级的小部件

Qt4:从 QDockedWidget 的子类访问 QtDesigner 创建的小部件

在 Qt 中的小部件内部绘画

如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?

我可以使用qt中的OpenGL功能而不需要任何类型的小部件吗?