这可能是一般的C ++编程问题,而不是Qt特定的问题。我遇到的问题是静态成员并初始化它们。
我有一个继承QAbstractTableModel的表模型类,我希望每个都有一个使用QFontDatabase :: families()的所有系统字体系列的列表。我正在尝试将这个系列列表设置为静态,以便它只填充一次。做这个的最好方式是什么?我无法理解如何初始化列表,因为它是静态的。这是我的意思的一个例子:
class Model : public QAbstractTableModel
{
public:
Model();
protected:
static QStringList fontFamilies;
}
Model::Model() : QAbstractTableModel(0)
{
fontFamilies = QFontDatabase().families();
}
我想我不应该在构造函数中初始化(我实际上没有尝试过上面的代码来看看编译器会说什么),但我不知道如何处理它。我不认为我能做到
QStringList Model::fontFamilies = QFontDatabase().families();
感谢您提供任何帮助!
答案 0 :(得分:1)
静态数据成员必须在类外定义。
class Model : public QAbstractTableModel
{
public:
Model();
protected:
static QStringList fontFamilies;
}
QStringList Model::fontFamilies = QFontDatabase().families();
这应该可以解决问题
答案 1 :(得分:1)
静态变量的非平凡初始化通常是有问题的。您为初始化调用的函数可能依赖于当时尚未初始化的资源。并且您无法控制首先初始化静态的顺序。
使用构造函数并不是一个坏主意。您只需要确保只初始化一次静态:
Model::Model() : QAbstractTableModel(0)
{
if(fontFamilies.isEmpty())
fontFamilies = QFontDatabase().families();
}
或者使用具有静态local的访问函数,而不是静态成员变量。只有在调用函数时,才会分配和初始化静态local。它很可能是在Qt库初始化之后:
const QStringList & Model::fontFamilies()
{
static QStringList fm = QFontDatabase().families();
return fm;
}