2017-08-05 22 views
0

特定のQStringの値が変更されるたびに、私のQtアプリケーションで変更が発生するようにしたいと思います。私はQStringのマニュアルの信号への参照を見つけることができませんでしたので、QStringをサブクラス化して、独自のシグナルを実装するか、または推奨される選択肢がありますか?Qtの観測可能なQString

+0

QStringはデータコンテナであるためシグナルを処理しませんが、QStringを継承してシグナルを実装するクラスを追加することが考えられます。 – eyllanesc

+2

文字列を変更するどのクラスでもそれを処理できませんか? – drescherjm

答えて

3

それはあなたがQtの中のデータのクラスからの通知を取得する方法はありませんので、あなたは、信号への参照を発見していません。あなたがする必要があるのは、the property systemです。

文字列をコア論理オブジェクトのQ_PROPERTYとして実装するだけです。

// in some QObject derived class 
Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged) 
QString m_text; 
signals: 
void textChanged(); 
// that's all you need 

latter is rather bigとして、QObjectを継承し、それぞれが、文字列の多くを持っているために大きなオーバーヘッドになります。ただし、オーバーヘッドがほとんどない単一のオブジェクトのプロパティとして多くの文字列を実装できます。

変更する文字列を監視するだけであれば、必要なのはプロパティだけです。 QStringのラッパーは、高度な機能、文字列の変更だけでなく、どのように変更されたのか、クリアされたのか、特定の文字が置き換えられたのか、切り捨てられたのか、別の文字列が挿入されたそして、どこ。データモデルのために得られるもの

+0

ありがとう、これは確かに行く方法に見えます。 –

1

簡単な解決策は、このようなものを使用して独自のクラスを定義するには、次のようになります。

class ObservableString : public QObject 
{ 
    Q_OBJECT 

public: 
    void setValue(const QString &value) { 
     m_string = value; 
     emit valueChanged(value); 
    } 

    QString value() const { 
     return m_string; 
    } 

signals: 
    void valueChanged(QString value); 

private: 
    QString m_string; 
}; 
関連する問題