gpt4 book ai didi

c++ - 有一个小部件声明顺序要遵循吗?

转载 作者:行者123 更新时间:2023-11-30 00:48:15 25 4
gpt4 key购买 nike

在 Qt5 中是否有声明小部件的顺序(也许也是 4 个)?

考虑以下代码片段:

(只是标题的一部分来帮助我解释)

class ConfigDialog : public QDialog
{
Q_OBJECT

QGroupBox userAuthBox;
QGridLayout userAuthLayout;
QVBoxLayout dialogLayout;

QLabel userLabel;
QLabel passLabel;
QLineEdit userEdit;
QLineEdit passEdit;
};

这按预期工作但只是更改为(重新排序声明):

class ConfigDialog : public QDialog
{
Q_OBJECT

QLabel userLabel;
QLabel passLabel;
QLineEdit userEdit;
QLineEdit passEdit;
QGroupBox userAuthBox;
QGridLayout userAuthLayout;
QVBoxLayout dialogLayout;
};

这也有效,但是当 ConfigDialog 超出范围时会发生段错误。

我也在其他场景中看到过这种情况,但总是更改顺序可以解决此问题。

最佳答案

我的猜测是:您使您的 QGroupBox 成为其他一些小部件的父级。

Qt 在 QObject 之间有一个父子关系的概念。 parent 负责在自己被销毁时删除其 child ;假设这些 child 是用 new 在堆上分配的。

此外,C++ 类的数据成员按照它们在类中列出的顺序构造,并以相反的顺序销毁。

假设 userAuthBoxuserLabel 的父级(通过 setParent 调用,在您的情况下由 addWidget).在第一种情况下,userLabel 首先被销毁,并将这一事实通知其父级,随后 userAuthBox 将其从其子部件列表中删除,并且不会尝试删除

在第二种情况下,userAuthBox 首先被销毁,并在其指向 userLabel 的指针上使用 delete。但是当然 userLabel 实际上并没有分配 new。该程序然后表现出未定义的行为。

关于c++ - 有一个小部件声明顺序要遵循吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com