在Qt应用程序中使用样式时,我遇到了QStyle
所有权的有趣问题。 QStyle
继承自QObject
,QObject* parent
通常接受QStyle
作为构造函数参数来管理其子级的生命周期。但QApplication::setStyle(QStyle * style)
的构造函数没有此构造函数参数。第一个问题 - 为什么会这样?
此外,在使用app->setStyle(new MyWonderStyle());
将样式设置为整个应用程序时,文档说应用程序对象获取样式的所有权。所以写作(如在文档中)QWidget::setStyle(QStyle* style)
应该是安全的,应用程序应该在不再使用时删除样式。我希望它能做到。
但对于widget->setStyle(new MyWonderStyle());
,文档说不会转让所有权。因此,在我看来,如果窗口小部件的样式设置了多次或者删除了窗口小部件,则写Declare @dbname varchar(200)
Declare @sql varchar(1000)
now comes dynamic sql
set @sql='select * from '@dbname+'dbo.yourtable';
会导致内存泄漏。
所以我的问题 - 管理自定义样式的最佳做法是什么,尤其是Qt中的所有权?有没有一些标准的方法,还是完全取决于开发人员来处理它?</ p>
答案 0 :(得分:3)
我会说QApplication::setStyle(QStyle*)
取得QStyle
的所有权,因为有一个重载函数QApplication::setStyle(QString)
。此函数在内部创建一个QStyle
对象并取得它的所有权,因为在这种情况下没有其他选项。在一个功能中拥有所有权而不在另一个功能中使用它可能会导致混淆。
另一方面,QWidget
并未取得QStyle
的所有权,因为您可能希望将相同的样式分配给多个QWidget
。
缺少QStyle(QObject*)
构造函数可能只是一种疏忽。您可以安全地使用setParent(QObject*)
。事实上,QApplication::setStyle(QStyle*)
使用setParent
来取得QStyle
的所有权。