我知道Qt文档中QLayout
对象是否拥有其小部件的所有权。但就QLayout
对象而言,可以安全地在堆栈上创建它,然后使用setLayout
函数将它传递给小部件?还是必须在堆上创建?在堆栈上创建QLayout是否安全?
#include <iostream>
#include <QtGui/QApplication>
#include <QPushButton>
#include <QVBoxLayout>
class LoudPushButton : public QPushButton
{
public:
virtual ~LoudPushButton(){std::cout << "~LoudPushButton()" << std::endl;}
};
class LoudQVBoxLayout : public QVBoxLayout
{
public:
virtual ~LoudQVBoxLayout(){std::cout << "~LoudQVBoxLayout()" << std::endl;}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget window;
// On the heap
LoudQVBoxLayout* mainlayout = new LoudQVBoxLayout;
mainlayout->addWidget(new LoudPushButton);
mainlayout->addWidget(new LoudPushButton);
window.setLayout(mainlayout);
/*
// On the stack
LoudQVBoxLayout mainlayout;
mainlayout.addWidget(new LoudPushButton);
mainlayout.addWidget(new LoudPushButton);
window.setLayout(&mainlayout);
*/
window.show();
return a.exec();
}
两种选择//在堆栈和//在堆产生相同的结果在出口处:
~LoudQVBoxLayout()
~LoudPushButton()
~LoudPushButton()
但我可以肯定,这是不是不确定的行为? window
是否在其布局上调用delete
?
编辑:
鉴于猫加上另外的答案我想这:
LoudPushButton button;
mainlayout->addWidget(&button);
mainlayout->addWidget(new LoudPushButton);
可生产即使button
和*mainlayout
保证在同一时间被删除未定义的行为。这是真的?
我认为你应该重新考虑接受的答案。我已经编辑了我的帖子,详细解释了Cat Plus Plus的答案与Qt的文档相矛盾。 – cgmb