2011-11-15 11 views
3

私のクラスは一連の項目を表します。このようなシーケンスのインスタンスは多数ありますが、ツリー構造の一部としてGUIに常に表示されます。シーケンスは、ツリーにデータを埋め込む役割を果たし、ツリーには独自のアイコンがあります。アイコンはすべてのシーケンスのために同じであるので、私はそれが静的作っ:QtのQIconのインスタンスを自分のクラスの静的メンバーとして持つことは可能ですか?

class Sequence 
{ 
public: 
    Sequence() { } 
    /* ... */ 

protected: 
    QList<SeqItem *> items_; 
    static const QIcon treeIcon_; 
}; 

const QIcon Sequence::treeIcon_ = QIcon(":/icons/seq.png"); 

問題は、私はアプリケーションを実行すると、それはとクラッシュするということである。

QPixmapの:QPaintDevice前にはQApplicationを構築する必要があります。

おそらく静的メンバーがメインウィンドウの前に作成されている可能性があります。だから私の質問は:私のクラスの静的メンバーとしてQIconsを持つことは可能ですか?

答えて

4

のように、アプリケーションの初期化後に呼び出す関数で静的初期化を使用することがあります。

static QIcon getSeqIcon() { 
    static QIcon icon = QIcon(":/icons/seq.png"); 
    return icon; 
} 

アプリケーションの前にも破壊する必要があるかどうかはわかりません。そうしたら、静的な共有ポインタを持ち、アプリケーションのシャットダウン時に手動で解放することができます。

+0

多すぎます。私はアイコンのパスを持つ静的なQStringsを持っているだろうと思うし、これらのパスからツリー充填機能でそれらをオンザフライで作成します。とにかくそれは時間が重要ではないし、あなたが指摘しているように、これはややばかげて不確実である。 – neuviemeporte

+2

ツリー充填機能では常に静的にすることができます。おそらく、ペイントデバイスはQIconの破壊ではなく、作成時にのみ使用されているので、おそらく上質です。 – Pete

+0

それはさらに良い考えです:) – neuviemeporte

1

エラーメッセージが示唆するように、私はそうではないと思います。しかし、treeIcon_を静的ポインタにして、QApplicationのサブクラスコンストラクタ内で初期化することができます。おそらくさらに良い場合は、QApplicationの中のフィールドにして

関連する問題