QWidget * parent作为用户定义类的构造函数中的参数

时间:2011-05-10 09:46:32

标签: qt qwidget

在我之前的帖子中,这里的人告诉我,每个小部件都有一个父级,它有助于删除,即当父级被删除时,子级会被自动抛出到/ 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;
 };

这表明了什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

我可以继续。也许其中一个标签有一些按钮,另一个标签有一些文本字段,无论如何。

您在此处所做的是创建QWidgets的层次结构。所以在这个例子的情况下,它看起来会像这样:

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,您可以告诉它其父级是什么。在此示例中,未使用它。 AddressBook本身就是最顶级的小部件。但它可以很容易地成为等级制度的一部分。

相当多的文字,但我希望它能在某种程度上解释这些概念。看看Qt附带的一些样本。你应该知道事情的结构。如果您没有看到它们如何连接,请按照上面的描述绘制图表。它应该开始对你有意义。如果有人有更正或更有用的技术见解,请随时评论或纠正我。

希望有所帮助。

答案 1 :(得分:1)

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

除了内存管理和组织(对于简单的QObject也有效)和布局(这不是必需的 - 你可以在父布局之外设置子窗口小部件),父子关系对QWidgets采取了一个有趣的转折:

  

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

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