Qt控件父对象的确认
如果是是通过手动编写程序的方式来设计界面,则在编写代码时手动指定各控件的父对象;
如果是使用Qt设计师来设计界面,则各控件的最终父对象为该界面类的对象。
如有一个查找对话框界面,则Qt为其自动生成的界面类代码如下:
头文件:
#ifndef FINDDLG_H#define FINDDLG_H#include <QDialog>namespace Ui {class FindDlg;}class FindDlg : public QDialog{Q_OBJECT
public:
explicit FindDlg(QWidget *parent = 0);~FindDlg();
private:
Ui::FindDlg *ui;};#endif // FINDDLG_H
这其实是使用单继承方式来使用Ui(关于使用Ui的更多细节请参阅《在Qt中如何使用QtDesigner创建的UI文件》)。实现文件:
#include "FindDlg.h"#include "ui_FindDlg.h"FindDlg::FindDlg(QWidget *parent) :QDialog(parent),ui(new Ui::FindDlg){ui->setupUi(this);QObject *a = ui->ButFind_1->parent()->parent()->parent()->parent(); // 此处为手动添加a->children(); // 此处为手动添加}FindDlg::~FindDlg(){delete ui;}
以上代码除注释处为手动添加之外,其余均为Qt自动生成的代码。 从以上代码中可发现,在构造FindDlg的时候,先执行setupUi,并传入参数this。setupUi的部分代码如下:
void setupUi(QDialog *FindDlg){if (FindDlg->objectName().isEmpty())FindDlg->setObjectName(QStringLiteral("FindDlg"));FindDlg->resize(302, 152);gridLayout = new QGridLayout(FindDlg);gridLayout->setObjectName(QStringLiteral("gridLayout"));TabChnl = new QTabWidget(FindDlg);TabChnl->setObjectName(QStringLiteral("TabChnl"));...}可见,在setupUi时,Qt为各控件设置了父对象,但所有控件的最终父对象都为setupUi时传入的this,也就是FindDlg的对象。这一点可通过以上程序来验证:
由于Qt在删除对象时会自动删除其子对象,因此无需显式delete这些用Qt设计师添加的控件。