2011-05-10 345 views
1

在我之前的主题中,人们在这里告诉我,每个小部件都有一个父项,这有助于删除情况,即,当父项被删除时,子项会自动抛出out到/ dev/null。QWidget * parent作为用户定义的类的构造函数中的参数

现在我看到QWidget的*父被传递到用户定义的类的构造函数在这里,在这个环节上:http://doc.qt.io/archives/qt-4.7/tutorials-addressbook-part1.html 类通讯录:公众的QWidget { Q_OBJECT

public: 
    AddressBook(QWidget *parent = 0); 

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

这说明什么?

+0

只是一个简单的问题:你了解Qt的父子关系?也就是说,小工具通常如何彼此“连接”? – Bart 2011-05-10 10:12:40

+0

感谢您的回复,我只理解上面提到的内容。当父母被删除时,孩子也被抛出,这就是我所理解的。现在这与上面用户定义的类有什么关系? – 2011-05-10 10:15:50

回答

3

Qt的Widgets,特别是在组合它们时,定义了一个层次结构。我们用一个(简化的)例子来看这个。

在我的应用程序中,我有一个中央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

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

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

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

(从Window and Dialog Widgets采取的Qt 4.7文档)。

相关问题