2017-08-05 72 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 

这将是有很多字符串显著的开销,每个继承QObject,为latter is rather big。但是,您可以将很多字符串实现为单个对象的属性,而且几乎没有开销。

如果您只想监视字符串以进行更改,那么属性就是您所需要的。一个包含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; 
};