1

在我之前的帖子中,这里的人告诉我,每个小部件都有一个父级,这有助于在删除的情况下,即当父级被删除时,子级会自动被丢弃到 /dev/null。

现在我看到QWidget *parent被传递给用户定义类的构造函数,在这个链接中:http://doc.qt.io/archives/qt-4.7/tutorials-addressbook-part1.html class AddressBook : public QWidget { Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

这说明什么?

4

2 回答 2

4

Qt 的小部件,尤其是在组合它们时,定义了一个层次结构。让我们用一个(简化的)示例直观地看一下这个。

在我的应用程序中,我有一个中央 QWidget。最重要的是另外两个小部件。用于一些 3D 渲染的 QGLWidget 和用于控件的 QTabWidget。这两个小部件是我的中央 QWidget 的孩子。

QTabWidget 有标签,它们本身就是 QWidget。让它们成为 QTabWidget 的孩子似乎是合乎逻辑的,对吧?

我可以继续。也许其中一个选项卡有一些按钮,另一个选项卡有一些文本字段,等等。

您在这里所做的是创建 QWidget 的层次结构。所以在这个例子的情况下,它看起来有点像这样:

QWidget (the Central Widget)
|
|-QGLWidget (my rendering window)
|-QTabWiget (the tab widget for my controls)
 |
 |-QWidget (the first tab)
 ||
 ||-QPushButton (a button on the first tab)
 |
 |-QWidget (the second tab)
  |
  |-QLineEdit (a widget to provide some input)

不管怎样,你明白我的意思。回到您的代码,您可以通过 QWidget(或任何派生的小部件)的构造函数来定义此层次结构。如果我创建我的 QGLWidget,在它的构造函数中我将提供一个指针作为我的中心 QWidget 作为它的父级。

这种层次结构有几个原因。您提到创建/删除。但也想象一下,如果你切换标签。什么元素应该显示在选项卡的顶部?当然是它的孩子。如果您开始使用 Qt,您将了解布局。将布局设置为小部件将影响该小部件的所有子级。还有其他几个原因(以及幕后发生的事情),但现在就足够了。

我的解释是相当概念性的。也许这不是技术上最详细和最正确的解释,但它应该给你一些指导。

回到您的代码示例。AddressBook 是从 QWidget 派生的。如果您将它放在您的 GUI 中,您可能希望将它放在另一个 Widget 之上。作为它的孩子。所以如果你添加这个地址簿,你可以告诉它它的父级是什么。在这个例子中,它没有被使用。AddressBook 本身就是最顶层的小部件。但它也可以很容易地成为层次结构的一部分。

相当多的文字,但我希望它能稍微解释一下这些概念。看看 Qt 附带的一些示例。您应该了解事物的结构。如果您看不到它们是如何连接的,请按照我上面所做的那样绘制图表。它应该开始对你有意义。如果有人有更正或更多可能有用的技术见解,请随时评论或纠正我。

希望有帮助。

于 2011-05-10T10:40:57.630 回答
2

构造函数建立小部件之间的父子关系。

除了内存管理和组织(这对普通 QObjects 也有效)和布局(这不是强制性的——您可以在父布局之外拥有子小部件),父子关系对于 QWidgets 有一个有趣的转折:

任何没有父级的 QWidget 都将成为一个窗口,并且在大多数平台上都会在桌面的任务栏中列出。

(取自Window and Dialog Widgets,Qt 4.7 文档。)

于 2011-05-10T13:51:23.540 回答