手机分销网站公司,猫咪多用户wordpress,微信分销平台排行,做网站怎么赚钱 注册Qt中通过对象树的方式#xff0c;实现了窗体自动析构#xff0c;只要我们使用得当#xff0c;就能免去自己去释放窗体对象的内存#xff0c;但是我们得清楚Qt窗体自动析构的机制#xff0c;什么情况下能够自动析构#xff0c;什么情况不能。操作不当的情况可能造成内存泄…Qt中通过对象树的方式实现了窗体自动析构只要我们使用得当就能免去自己去释放窗体对象的内存但是我们得清楚Qt窗体自动析构的机制什么情况下能够自动析构什么情况不能。操作不当的情况可能造成内存泄漏甚至会出现程序崩溃问题。
下面通过一系列示例进行探究。
设置父窗体
这种情况规则最简单在创建窗体或控件时指定其parent对象当parent对象销毁时则会析构该窗体。
QComboBox* cbxnew QComboBox(this);//this窗体被析构时cbx自动析构
Qt中如果一个widget创建时没有指定parent但是被其他窗体设置为centerWidget()后 其他窗体析构时该窗体能正常析构
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{MyWidget* wnew MyWidget();//MainWindow将成为w的父窗体this-setCentralWidget(w);
}
设置窗体关闭时自动销毁
Qt中如果一个widget没有指定parent但设置setAttribute(Qt::WA_DeleteOnClose); 该窗口关闭时析构
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//w作为一个独立的窗体展示点击关闭按钮后窗体自动析构MyWidget* wnew MyWidget();w-show();w-setAttribute(Qt::WA_DeleteOnClose);
// this-setCentralWidget(w);
}
Qt中如果一个widget没有指定parent且没有设置setAttribute(Qt::WA_DeleteOnClose); 该窗口关闭时不会析构主窗口关闭后该窗口也不会析构
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//w作为一个独立的窗体展示关闭后并不会销毁MyWidget* wnew MyWidget();w-show();
}
放入父窗体的布局之中
如果一个控件在new时没有指定parent,但是放在了一个另窗体的布局中该窗体关闭时 该控件将析构。将控件放入一个窗体的布局中时将自动设置该窗体为控件的父窗体。
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* editnew MyLineEdit();//没有指定parentQVBoxLayout* layoutnew QVBoxLayout();layout-addWidget(edit);//放在一个widget的布局中this-setLayout(layout);//当放入到当前窗体的布局中时当前窗体将成为edit的父窗体
}
指定父窗体又放入布局
Qt中如果一个控件指定了widget1作为parent,但是又放在了widget2的布局中 在widget2被析构的时候该控件将被析构
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* editnew MyLineEdit(parent);//指定widget1作为parentQVBoxLayout* layoutnew QVBoxLayout();layout-addWidget(edit);//edit的实际parent已经更改为widget2( this, MyWidget*)this-setLayout(layout);
} 其他设置父窗体的场景
控件放入表格中
Qt中将一个编辑框放置在一个表格中当表格被析构的时候编辑框也被析构
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* editnew MyLineEdit(parent);QTableWidget* tablenew QTableWidget(this);table-setColumnCount(2);table-setRowCount(2);table-setCellWidget(0,0,edit);//表格table析构时edit也被析构QVBoxLayout* layoutnew QVBoxLayout();layout-addWidget(table);this-setLayout(layout);}