Q风格所有权

QStyle ownership

本文关键字:所有权 风格      更新时间:2023-10-16

在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的所有权。