Qt 为什么控件要用指针创建?
在 Qt 开发中,我们经常会看到类似这样的代码:
QCheckBox *chkBoxUnder;
QRadioButton *radioBlack;
QPushButton *btnOK;
QPlainTextEdit *txtEdit;
为什么这些控件都要用指针?
1. 生命周期与父对象管理
Qt 的控件采用 父子关系 来自动管理内存。例如:
chkBoxUnder = new QCheckBox("Underline", this);
this
是父对象(通常是QDialog
或QWidget
)当父对象析构时,会自动删除所有子控件,避免内存泄漏
如果控件写成普通对象:
QCheckBox chkBoxUnder; // ❌
构造函数结束后控件就已经创建完成,但无法指定父对象
布局管理和生命周期可能不一致 → 可能导致崩溃或显示异常
2. 动态创建控件,方便布局管理
在 Qt 中,控件通常是 动态创建:
HLay1->addWidget(chkBoxUnder);
如果使用普通对象,控件会在构造函数结束后被销毁,布局中就会出现悬空指针,程序容易崩溃
3. 成员函数访问控件
槽函数中需要访问控件状态:
void Dialog::on_chkBoxUnder_clicked(bool checked)
{QFont font = txtEdit->font();font.setUnderline(checked);txtEdit->setFont(font);
}
只有控件是 成员指针,才能在槽函数中随时访问
如果是局部对象,构造函数结束后控件已经销毁,无法访问