Qt C ++: Статический список семейств шрифтов - PullRequest
1 голос
/ 04 мая 2011

Это может быть более общий вопрос программирования на C ++, чем специфический для Qt. У меня проблема со статическими элементами и их инициализацией.

У меня есть класс табличной модели, который наследует QAbstractTableModel, и я хочу, чтобы у каждого был список всех семейств системных шрифтов, используя QFontDatabase :: family (). Я пытаюсь сделать этот список семей статичным, чтобы он был заполнен только один раз. Каков наилучший способ сделать это? У меня проблемы с пониманием, как инициализировать список, так как он статический. Вот пример того, что я имею в виду:


class Model : public QAbstractTableModel
{
public:
    Model();
protected:
    static QStringList fontFamilies;
}

Model::Model() : QAbstractTableModel(0)
{
    fontFamilies = QFontDatabase().families();
}

Я думаю, что я не должен инициализироваться в конструкторе (и я на самом деле не пробовал приведенный выше код, чтобы увидеть, что скажет компилятор), но я не уверен, как подойти к этому. Я не думаю, что могу сделать


QStringList Model::fontFamilies = QFontDatabase().families();

Спасибо, если вы можете оказать любую помощь!

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Нетривиальная инициализация статических переменных обычно проблематична.Функции, которые вы вызываете для инициализации, могут зависеть от ресурсов, которые еще не инициализированы в данный момент.И у вас нет контроля над порядком того, что static инициализируется первым.

Использование конструктора - неплохая идея.Вам просто нужно убедиться, что вы инициализируете статику только один раз:

Model::Model() : QAbstractTableModel(0)
{
    if(fontFamilies.isEmpty())
        fontFamilies = QFontDatabase().families();
}

Или вместо статической переменной-члена используйте функцию доступа со статическим локальным.Статический local будет выделен и инициализирован только при вызове функции.Скорее всего, это будет после инициализации библиотеки Qt:

const QStringList & Model::fontFamilies()
{
    static QStringList fm = QFontDatabase().families();
    return fm;
}
1 голос
/ 04 мая 2011

Статический член данных должен быть определен вне класса.

class Model : public QAbstractTableModel
{
public:
   Model();
protected:
    static QStringList fontFamilies;
}
QStringList Model::fontFamilies = QFontDatabase().families();

Это должно сработать

...