Qt控件父对象的确认

原文地址::http://blog.csdn.net/desert187/article/details/39671797


相关文章

1、QT findChild() 及动态初始化窗体布局(原创)----http://zhaiyue-program.iteye.com/blog/1546394

2、在Qt中如何使用QtDesigner创建的UI文件(一)----http://blog.csdn.net/desert187/article/details/39672039

3、在Qt中如何使用QtDesigner创建的UI文件(二)----http://blog.csdn.net/desert187/article/details/39672061


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设计师添加的控件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值