在QT中所有权是对还是错
Is there a right or wrong for ownership in Qt
我想编写"现代C " QT应用程序,这意味着尽可能多地使用RAII。因此,我问自己是否可以安全地使用自动分配:
#include <QApplication>
#include <QtWidgets>
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Der eine Knopf");
QPushButton button{"Ende"};
QObject::connect( &button, SIGNAL(clicked()), &app, SLOT(quit()));
QVBoxLayout layout{};
layout.addWidget(&button);
window.setLayout(&layout);
window.show();
return app.exec();
}
原始教程代码有很多指针和堆:
#include <QApplication>
#include <QtWidgets>
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Hallo Qt");
QPushButton button = new QPushButton("Ende");
QObject::connect( button, SIGNAL(clicked()),
&app, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button);
window.setLayout(layout);
window.show();
return app.exec();
}
我一般都知道QT的QObject
的所有权概念。因此,我认为第二个示例是正确的。我认为setLayout
和addWidget
也更改所有权,因此我作为客户不需要明确的delete
。
假设我想知道 - 为什么我的第一个示例会起作用?如果这些方法获得所有权,他们是否最终不会delete
他们新收购的孩子?如果他们这样做,我的程序会不会崩溃,因为对象被删除了两次?(该程序不会崩溃,我会提到。但是那可能是偶然的,对吗?(
我现在非常困惑谁拥有谁以及它如何工作,我不知道它如何。我听到的一条规则是" QT会照顾好" - 但是"什么"?而不是什么?
好吧,显然我是QT的新手,我想要的是对QObject
的构造函数和破坏者计数的一些见解。或每次施工和/或破坏的消息。QT中是否有这样的设施?
如果您查看对象树和所有权,则使用自动分配时,必须注意创建顺序。本地对象的破坏者以其构造函数的相反顺序调用。
所以在您的示例中:
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Der eine Knopf");
QPushButton button{"Ende"};
QObject::connect( &button, SIGNAL(clicked()), &app, SLOT(quit()));
QVBoxLayout layout{};
layout.addWidget(&button);
window.setLayout(&layout);
window.show();
return app.exec();
}
在这里您创建一个称为window
的QWidget
对象。然后,您创建一个QPushButton
。您将布局设置为小部件,然后将button
添加到该布局。布局将自动将window
设置为button
的父。但是,当您退出应用程序并结束范围时,button
将首先被销毁。在破坏之后,它将从window
的儿童名单中删除。因此不会被销毁两次。
但是,如果您在window
之前创建button
,则window
将在button
之前被销毁,并且还将摧毁所有孩子。这意味着它也将调用button
的攻击函数。此后,button
的驱动器将在范围范围内再次被调用。所以在这里您会有一个大问题。
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- 我是否需要在下一次转移时将所有权*转移回转移队列
- Qt对象所有权内存泄漏
- 在QT中所有权是对还是错
- 从 Qt 类派生的用户定义类中的内存所有权
- Qt信号:将动态分配参数的所有权传递给插槽