Qt C ++:字体系列的静态列表

时间:2011-05-04 01:30:19

标签: c++ qt static initialization

这可能是一般的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();

感谢您提供任何帮助!

2 个答案:

答案 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;
}