请看下面的代码:
QStackedLayout stackLayout(this);
QStackedLayout stackLayout = QStackedLayout(this);
我有两个问题:
为什么第二个陈述不可能?
当我在头文件中声明变量而不是指针时,如何调用 QStackedLayout 的构造函数?
首先,我认为您误解了构造函数。Qt 为其元素使用父元素,因为它会在堆上创建时管理它们的存储持续时间:
// here you need this constructor, so Qt will free the resource for you
QStackedLayout * layout = new QStackedLayout(this);
// here you don't need it, the object has automatic storage duration
QStackedLayout layout;
然后,如果要为头文件中声明的对象调用某个构造函数,请使用初始化列表:
struct foo
{
foo()
: s("demo")
{}
std::string s;
};
该对象派生自QObject
,因此不可复制 - 这就是您的第二条语句不起作用的原因。
您应该将 stackLayout 定义为指针
QStackedLayout* stackLayout = new QStackedLayout(this);
第一个问题很简单:QStackedayout 继承了 QObject。你永远不能复制或分配 QObjects。
第二个问题是调用 QStackedLayout 的构造函数。但我想你真的很想知道,如何在你的 .h 文件中做到这一点?只有默认构造函数是可能的。在这种情况下,指针很好。或者您放入QStackedLayout layout
.h 文件并在构造函数中添加类似 layout.setParent(this) 的内容。我从来没有这样做过。我觉得很奇怪。所以不知道有没有什么缺点。
编辑:呃……脸红……“唯一的默认构造函数”当然是胡说八道。有时多思考一两秒是值得的。尤其是关于自己很少使用的构造。:-)