Qt 中可观察的 QString
Observable QString in Qt
我希望只要特定 QString 的值发生变化,我的 Qt 应用程序就会发生变化。我没有在 QString
文档中找到任何对信号的引用,所以我需要子类化 QString
并实现我自己的信号还是有首选的替代方案?
一个简单的解决方案是定义您自己的 class,如下所示:
class ObservableString : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(ObservableString)
public:
void setValue(const QString &value) {
if (m_string != value) {
m_string = value;
emit valueChanged(value);
}
}
QString value() const {
return m_string;
}
signals:
void valueChanged(QString value);
private:
QString m_string;
};
您没有找到任何对信号的引用,因为这不是您在 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
周围的包装器仅在您需要高级功能时才合理,不仅通知字符串已更改,还通知它如何更改、是否已清除、是否替换了特定字符、是否删除了一部分或被删除那里插入了另一个字符串和位置。有点像你得到的数据模型。
我希望只要特定 QString 的值发生变化,我的 Qt 应用程序就会发生变化。我没有在 QString
文档中找到任何对信号的引用,所以我需要子类化 QString
并实现我自己的信号还是有首选的替代方案?
一个简单的解决方案是定义您自己的 class,如下所示:
class ObservableString : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(ObservableString)
public:
void setValue(const QString &value) {
if (m_string != value) {
m_string = value;
emit valueChanged(value);
}
}
QString value() const {
return m_string;
}
signals:
void valueChanged(QString value);
private:
QString m_string;
};
您没有找到任何对信号的引用,因为这不是您在 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
周围的包装器仅在您需要高级功能时才合理,不仅通知字符串已更改,还通知它如何更改、是否已清除、是否替换了特定字符、是否删除了一部分或被删除那里插入了另一个字符串和位置。有点像你得到的数据模型。