在 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因为您可能希望将相同的样式分配给多个QWidgets。
缺少QStyle(QObject*)构造函数可能只是一个疏忽。您可以放心使用setParent(QObject*)。实际上,QApplication::setStyle(QStyle*)用于setParent获取QStyle.