2017-08-05 4 views
0

Je voudrais que des changements se produisent dans mon application Qt chaque fois qu'une valeur de QString spécifique change. Je n'ai trouvé aucune référence aux signaux dans la documentation QString, alors dois-je sous-classer QString et implémenter mes propres signaux ou y at-il des alternatives préférées?QString observable dans Qt

+0

QString ne gère pas les signaux car il s'agit d'un conteneur de données, une solution possible est peut-être d'ajouter créer une classe qui hérite de QString et implémenter les signaux. – eyllanesc

+2

Vous ne pouvez pas gérer cela sur n'importe quelle classe change la chaîne? – drescherjm

Répondre

3

Vous avez trouvé aucune référence à des signaux, car ce n'est pas comment vous obtenez des notifications des classes de données dans Qt. Ce que vous devez faire est d'utiliser the property system.

Implémentez simplement la chaîne en tant que Q_PROPERTY d'un objet logique de base.

// 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 

Ce serait une surcharge importante pour avoir beaucoup de cordes, dont chacun héritant QObject, comme latter is rather big. Cependant, vous pouvez avoir beaucoup de chaînes implémentées en tant que propriétés d'un seul objet avec pratiquement aucune surcharge.

Si tout ce que vous voulez faire est de surveiller une chaîne pour les changements, alors une propriété est tout ce dont vous avez besoin. Un wrapper autour de QString n'est justifié que si vous avez besoin de fonctionnalités avancées, de notifications non seulement que la chaîne a changé, mais a changé, a-t-elle été effacée, un caractère particulier a-t-il été remplacé ou est-il inséré et où. Un peu ce que vous obtenez pour un modèle de données.

+0

Merci, cela semble en effet être le chemin à parcourir. –

1

Une solution simple serait de définir votre propre classe avec quelque chose comme ceci:

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