Использование QAbstractItemModel в качестве Q_PROPERTY внутри c ++ с READ WRITE - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать модель фильтра с исходной моделью внутри QML. Обе мои модели основаны на c ++ и зарегистрированы как модули.

При условии, что у меня есть:

ListView {
    id: autocomplete
    anchors.top: field.bottom
    model: MyTreeModelCompleter {
        separator: "."
        model: MyTreeModel{}

    }
}

C ++ MyTreeModelCompleter:

class TreeModelCompleter : public QCompleter
{
    Q_OBJECT
    Q_PROPERTY(QString separator READ separator WRITE setSeparator)
    Q_PROPERTY(QAbstractItemModel* model READ model WRITE setModel)

public:
    explicit TreeModelCompleter(QObject *parent = Q_NULLPTR);
    explicit TreeModelCompleter(QAbstractItemModel *model, QObject *parent = Q_NULLPTR);

    QString separator() const;
    QAbstractItemModel* model();
public slots:
    void setSeparator(const QString&);
    void setModel(QAbstractItemModel*);

protected:
    QStringList splitPath(const QString &path) const override;
    QString pathFromIndex(const QModelIndex &index) const override;

private:
    QString m_sep;
    QAbstractItemModel *m_model;
};

MyTreeModel c ++:

class MyTreeModel : public QAbstractItemModel
{
    Q_OBJECT
...
};

MyTreeModel QML:

MyTreeElement {
    property bool check
    property string name: "name1"
    property string description: "desc of name1"

    MyTreeElement {
        property bool check
        property string name: "name2"
        property string description: "desc of name2"
    }
    MyTreeElement {
        property bool check
        property string name: "name3"
        property string description: "desc of name3"

        MyTreeElement {
            property bool check
            property string name: "name 4"
            property string description: "desc of name4"

            MyTreeElement {
                property bool check
                property string name: "name 5"
                property string description: "desc of name5"
            }
        }

    }
}

MyTreeelement:

class MyTreeNode : public QObject
{
    Q_OBJECT
public:
    Q_PROPERTY(QQmlListProperty<MyTreeNode> nodes READ nodes)
    Q_CLASSINFO("DefaultProperty", "nodes")
    MyTreeNode(QObject *parent = Q_NULLPTR);

    void setParentNode(MyTreeNode *parent);
    Q_INVOKABLE MyTreeNode *parentNode() const;
    bool insertNode(MyTreeNode *node, int pos = (-1));
    QQmlListProperty<MyTreeNode> nodes();

    MyTreeNode *childNode(int index) const;
    void clear();

    Q_INVOKABLE int pos() const;
    Q_INVOKABLE int count() const;

private:
    QList<MyTreeNode *> m_nodes;
    MyTreeNode *m_parentNode;
};

Моя основная проблема - это включение MyTreeModel в завершенную модель MyTreeModelCompleter. Проблема возникает, когда я пытаюсь связать их, компилятор жалуется, что значения не совпадают в типах, поскольку 1 - QAbstractItemModel*, а другое - QAbstractItemModel. Есть ли способ заставить эту модель работать? Это ни в коем случае не рабочий код, потому что я думаю, что проблема заключается во встраивании моделей друг в друга, а не в фактический код.

Ошибка:

Невозможно назначить объект типа «MyTreeModel» свойству типа «QAbstractItemModel *» в качестве первого не совпадает с последним ни подкласс этого.

1 Ответ

0 голосов
/ 09 января 2019

Чтобы решить эту проблему, используйте QObject * вместо QAbstractItemModel * для свойства model. Вот пример:

    class TreeModelCompleter : public QCompleter
    {
        Q_OBJECT
        Q_PROPERTY(QString separator READ separator WRITE setSeparator)
        Q_PROPERTY(QObject* model READ model WRITE setModel)

    public:
        explicit TreeModelCompleter(QObject *parent = Q_NULLPTR);
        explicit TreeModelCompleter(QAbstractItemModel *model, QObject *parent = Q_NULLPTR);

        QString separator() const;
        QObject* model();
    public slots:
        void setSeparator(const QString&);
        void setModel(QObject*); 

    protected:
        QStringList splitPath(const QString &path) const override;
        QString pathFromIndex(const QModelIndex &index) const override;

    private:
        QString m_sep;
        QAbstractItemModel *m_model;
    };
...