在Qt应用程序中使用样式时,我遇到了一个有趣的QStyle所有权问题。QStyle继承自QObject,后者通常接受QObject* parent作为构造函数参数来管理其子生命周期。但是QStyle的构造函数没有这个构造函数参数。第一个问题--为什么?
此外,当使用QApplication::setStyle(QStyle * style)将样式设置为整个应用程序时,文档表明应用程序对象拥有样式的所有权。因此,编写(如文档中的) app->setStyle(new MyWonderStyle());应该是安全的,应用程序应该在不再使用时删除样式。我希望它能做到。
但是对于QWidget::setStyle(QStyle* style),文档中说所有权是不转移的。因此,在我看来,如果小部件的样式设置不止一次或小部件被删除时,编写widget->setStyle(new MyWonderStyle());会导致内存泄漏。
那么,我的问题是,管理自定义样式的最佳实践是什么,特别是Qt中的所有权?是否有某种标准的方法,还是完全由开发人员来处理?
发布于 2016-06-13 12:12:08
我想说的是,QApplication::setStyle(QStyle*)拥有QStyle的所有权,因为有一个重载的函数QApplication::setStyle(QString)。这个函数在内部创建一个QStyle对象,并获得它的所有权,因为在这种情况下没有其他选项。在一种功能中取得所有权,而不是在另一种功能中使用它可能会导致混乱。
另一方面,QWidget不拥有QStyle,因为您可能希望将相同的样式分配给多个QWidget。
缺少QStyle(QObject*)构造函数可能只是一个疏忽。您可以安全地使用setParent(QObject*)。事实上,QApplication::setStyle(QStyle*)使用setParent来获得QStyle的所有权。
https://stackoverflow.com/questions/37786568
复制相似问题