Q风格所有权
QStyle ownership
在Qt应用程序中使用样式时,我遇到了一个有趣的QStyle
所有权问题。QStyle
继承自QObject
,后者通常接受QObject* parent
作为构造函数参数来管理其子级的生存期。但是QStyle
的构造函数没有这个构造函数参数。第一个问题——为什么?
此外,当使用QApplication::setStyle(QStyle * style)
为整个应用程序设置样式时,文档表明应用程序对象拥有该样式的所有权。因此,编写(如在文档中)app->setStyle(new MyWonderStyle());
应该是安全的,并且应用程序应该在不再使用时删除样式。我希望它能做到这一点。
但对于QWidget::setStyle(QStyle* style)
,文件显示所有权并未转让。因此,在我看来,如果多次设置小部件的样式或删除小部件,编写widget->setStyle(new MyWonderStyle());
会导致内存泄漏。
所以我的问题是,管理自定义样式的最佳实践是什么,尤其是Qt中的所有权?是否有一些标准的方法,或者完全由开发人员来处理?
我想说QApplication::setStyle(QStyle*)
拥有QStyle
的所有权,因为有一个重载函数QApplication::setStyle(QString)
。此函数在内部创建一个QStyle
对象并获取其所有权,因为在这种情况下没有其他选项。对一个职能拥有所有权而不对另一个职能持有所有权可能会导致混乱。
另一方面,QWidget
不拥有QStyle
的所有权,因为您可能希望将相同的样式分配给多个QWidget
。
缺少QStyle(QObject*)
构造函数可能只是一个疏忽。您可以安全地使用setParent(QObject*)
。事实上,QApplication::setStyle(QStyle*)
使用setParent
来获得QStyle
的所有权。
- Qt VTK交互风格的信号到小部件
- 我可以使用条件运算符初始化C风格的字符串文字吗
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 智能指针概念所有权和寿命
- 重载运算符<<采用谷歌 C++ 风格
- C++许多 SFINAE 风格的过载
- 对象超出范围/转让所有权
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- 谷歌风格指南(前向分枝部分)
- 在不授予所有权的情况下公开shared_pointers载体
- 分离类所有权和使用,生成最佳(快速)代码
- 如何使用 cmake pack redhat 风格的 rpm,这是主要的和"-devel"?
- std::unique_ptr 在获得所有权之前进行测试
- Qt对象所有权内存泄漏
- 如何用符合C++核心准则的代码替换C风格的字符串解析
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 用现代C++STL数据结构替换旧的C风格数组
- Q风格所有权