0

我是 Qt 的新手,并且编写了一个基本应用程序,它有一个继承自 QObject 并绑定到 QML 文件的类。

我现在希望该类包含一个对象向量(假设来自一个客户类),其中包含一些数据,例如用于名称的 QString 等。

为了让生活更轻松,我将在 main 中手动创建这些对象,并在我的 QML 文件中放置一些文本字段。

我现在希望能够将特定对象绑定到 QML 文件中的特定文本字段,这样当值更改时,文本字段中的值也会更新。

如何才能做到这一点?看起来 QML 静态调用它绑定到的类的方法,而不是在分配的对象上。

我觉得 QAbstractList 在这里可能有一些用处,但不太确定。宁愿不必为我的客户类继承任何东西。

编辑:

我想我可以使用基于 QObjectList 的模型(https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html)来做我想做的事。我注意到它在底部说“视图无法知道 QList 的内容已更改。如果 QList 更改,则有必要通过再次调用 QQmlContext::setContextProperty() 来重置模型。”

这是否意味着如果 DataObject 中的值(例如名称)发生更改,则必须重置模型,或者仅当 Qlist 本身发生更改时(即添加新项目或删除项目)?如果是后者,我认为这应该很容易维护,因为我只需要在添加或删除任何内容时设置上下文属性。

4

2 回答 2

0

这很简单,您需要使用 NOTIFY 来定义您的属性,如下所示:

Q_PROPERTY (QString name READ name WRITE setName NOTIFY nameChanged)

那么你需要像这样定义每一个:

public : QString name() const;

signals :
void nameChanged(QString name);

public slots:
void setName(const QString &name);

private QString _name;

然后你应该像这样在 cpp 中定义 body :

QString className::name() const{
   return _name;
}
void className::setName(const QString &name){
    if(name==_name) return;
    _name = name;
    Q_EMIT nameChanged(_name);

}

将其注册到 QML 后qmlRegisterType<ClassName>("com.className",1,0,"className");

只需设置名称,它会通知它是否更改,例如在文本字段中将文本设置为该名称属性

于 2019-08-31T16:53:31.763 回答
0

如果您想在 QML 脚本中处理原始 QObject 实例,这可能很有用。您可以将属性附加到 Element 类并从 qml 修改它们。

class Element : public QObject {
  Q_OBJECT
  private:
    QString type;
    QLinkedList<Element*> child;
  public:
    explicit Element(QString type, QLinkedList<Element*> child);
    virtual ~Element();
  public:
    QLinkedList<Element*> getChild() const;
    QString getType() const;
  public:
    static void printTree(Element* root);
};

在此处输入图像描述

于 2019-08-23T21:52:58.733 回答