2011-05-04 54 views
1

這可能比Qt特定的更通用的C++編程問題。我遇到的問題是靜態成員並初始化它們。Qt C++:字體系列的靜態列表

我有一個表模型類繼承了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(); 

謝謝,如果你能提供任何幫助!

回答

1

不平凡的初始化通常是有問題的。您調用的初始化函數可能取決於當時尚未初始化的資源。你無法控制靜態首先被初始化的順序。

使用構造函數不是一個壞主意。你只需要確保你初始化靜態只有一次:

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

或者,而不是靜態成員變量,使用訪問函數與靜態本地。只有在調用函數時,靜態本地纔會被分配和初始化。它很可能是Qt庫初始化後:

const QStringList & Model::fontFamilies() 
{ 
    static QStringList fm = QFontDatabase().families(); 
    return fm; 
} 
1

靜態數據成員必須定義外部類。

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

這應該做的伎倆靜態變量的

+0

感謝您的答覆。我遇到了一個問題 - 一切都很好編譯,但是當我嘗試運行程序時遇到段錯誤。我早些時候也遇到了同樣的問題,我認爲原因是QApplication需要在QFontDatabase初始化之前進行初始化,並且由於這是靜態的,它會導致問題。我想這是一個無關緊要的問題,但你知道這件事嗎? – buck 2011-05-04 02:42:27

+0

關於segfault,如果你在linux上,你可以試試valgrind。它可以幫助您快速指出問題。 – Dikei 2011-05-04 03:52:26

+0

段錯誤可能是由錯誤的靜態初始化順序造成的。 QFontDatabase可能需要一些在靜態分配時不可用的資源。 – 2011-05-04 04:10:20