在下面的 Qt 类示例中,许多对象是在构造函数和构造函数调用的函数中创建的,但不是由属性指针指向的,据我所知,不能在析构函数中删除(有在关键字 delete 的任何文件中都不存在)。
http://qt-project.org/doc/qt-4.8/widgets-groupbox.html
在window.h中
class Window : public QWidget
{
Q_OBJECT
public:
Window(QWidget *parent = 0);
private:
QGroupBox *createFirstExclusiveGroup();
QGroupBox *createSecondExclusiveGroup();
QGroupBox *createNonExclusiveGroup();
QGroupBox *createPushButtonGroup();
};
在window.cpp中
Window::Window(QWidget *parent)
: QWidget(parent)
{
QGridLayout *grid = new QGridLayout;
grid->addWidget(createFirstExclusiveGroup(), 0, 0);
grid->addWidget(createSecondExclusiveGroup(), 1, 0);
grid->addWidget(createNonExclusiveGroup(), 0, 1);
grid->addWidget(createPushButtonGroup(), 1, 1);
setLayout(grid);
setWindowTitle(tr("Group Boxes"));
resize(480, 320);
}
QGroupBox *Window::createFirstExclusiveGroup()
{
QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));
QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));
radio1->setChecked(true);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1);
vbox->addWidget(radio2);
vbox->addWidget(radio3);
vbox->addStretch(1);
groupBox->setLayout(vbox);
return groupBox;
}
我是不是遗漏了什么或者它是一个“糟糕”的实现示例? 正确的实现是将指针作为类 Window 的属性并销毁它们在 ~Window() 中指向的内容吗?谢谢。
最佳答案
因为所有对象都被添加到对象树中,所以它们会被自动删除。
例如所有小部件都添加到布局中,布局本身在窗口中设置。这将创建一个对象树。
您可以使用方法 QObject::dumpObjectTree()
获取当前对象树的可视化表示。
另见 Object Trees & Ownership在 Qt 文档中了解详细信息。
关于C++,Qt : deallocation of "non attribute" objects created in constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22857891/