简体   繁体   English

QT QML 导入 ListModel 从 C++ 到 ZC477ABFB7FD4959A20D5E0240ADC26B0

[英]QT QML import ListModel from C++ to QML

How can i change the model of a PathView with c++ code?如何使用 c++ 代码更改 PathView 的 model? i add an objectName to my pathView to find it, then i change the property like this, but when i do that, my list is empty:我将 objectName 添加到我的 pathView 以找到它,然后我像这样更改属性,但是当我这样做时,我的列表是空的:

QDeclarativeItem *listSynergie  = myClass.itemMain->findChild<QDeclarativeItem*> ("PathViewInscription");
listSynergie->setProperty("model", QVariant::fromValue(dataList));

My data list is fill like this:我的数据列表是这样填写的:

QList<QObject*> dataList;
dataList.append(new synergieListObject("Item 1", "1",false));
dataList.append(new synergieListObject("Item 2", "2",true));
dataList.append(new synergieListObject("Item 3", "3",false));
dataList.append(new synergieListObject("Item 4", "4",false));

This is the code of my PathView:这是我的 PathView 的代码:

PathView {
    objectName: "PathViewInscription"
    Keys.onRightPressed: if (!moving) { incrementCurrentIndex(); console.log(moving) }
    Keys.onLeftPressed: if (!moving) decrementCurrentIndex()
    id: view
    anchors.fill: parent
    highlight: Image { source: "../spinner_selecter.png"; width: view.width; height: itemHeight+4; opacity:0.3}
    preferredHighlightBegin: 0.5
    preferredHighlightEnd: 0.5
    focus: true
    model: appModel
    delegate: appDelegate

    dragMargin: view.width/2
    pathItemCount: height/itemHeight
    path: Path {
        startX: view.width/2; startY: -itemHeight/2
        PathLine { x: view.width/2; y: view.pathItemCount*itemHeight + itemHeight }
    }
}

and the code of ListModel:和 ListModel 的代码:

ListModel {
    id: appModel
    ListElement { label: "syn1"; value: "1"; selected:false}
    ListElement { label: "syn2"; value: "2" ; selected:false}
    ListElement { label: "syn3"; value: "3" ; selected:false}
}

what's wrong?怎么了? Thanks !谢谢 !

EDIT:编辑:

the code of the appDelegate: appDelegate 的代码:

    Component {
    id: appDelegate
    Item {
        width: 100; height: 100

        Text {
            anchors { horizontalCenter: parent.horizontalCenter }
            text: label
            smooth: true
        }

        MouseArea {
            anchors.fill: parent
            onClicked: view.currentIndex = index
        }
    }
}

the code of my object:我的 object 的代码:

    #ifndef SYNERGIELISTOBJECT_H
#define SYNERGIELISTOBJECT_H
#include <QObject>

class synergieListObject : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged)
    Q_PROPERTY(QString value READ value WRITE setValue NOTIFY valueChanged)
    Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectedChanged)

public:
    synergieListObject(QObject *parent=0);
    synergieListObject(const QString &label,const QString &value,bool selected, QObject *parent=0);

    QString label() const;
    void setLabel(const QString &label);

    QString value() const;
    void setValue(const QString &value);

    bool selected() const;
    void setSelected(const bool &selected);

signals:
    void labelChanged();
    void valueChanged();
    void selectedChanged();

private:
    QString m_label;
    QString m_value;
    bool m_selected;
};

#endif // SYNERGIELISTOBJECT_H

c++ my object: c++ 我的 object:

#include "synergielistobject.h"


synergieListObject::synergieListObject(QObject *parent): QObject(parent)
{
}

synergieListObject::synergieListObject(const QString &label,const QString &value,bool selected, QObject *parent): QObject(parent), m_label(label), m_value(value), m_selected(selected)
{
}

QString synergieListObject::label() const
{
    return m_label;
}

void synergieListObject::setLabel(const QString &label)
{
    if (label != m_label) {
        m_label = label;
        emit labelChanged();
    }
}


QString synergieListObject::value() const
{
    return m_value;
}

void synergieListObject::setValue(const QString &value)
{
    if (value != m_value) {
        m_value = value;
        emit valueChanged();
    }
}


bool synergieListObject::selected() const
{
    return m_selected;
}

void synergieListObject::setSelected(const bool &selected)
{
    if (selected != m_selected) {
        m_selected = selected;
        emit selectedChanged();
    }
}

I have never used QdeclarativeItem to set model in QML.我从未使用 QdeclarativeItem 在 QML 中设置 model。 Try this instead试试这个

QDeclarativeContext *ctxt = view.rootContext(); ctxt->setContextProperty("model",  QVariant::fromValue(dataList));

Declare the model as a property of the root.将 model 声明为根的属性。 This way you can set model.Or add a function that takes model as argument and sets the model for the view.通过这种方式,您可以设置 model。或者添加一个 function 以 model 作为参数,并为 viewF35E630DAF399DFA8 设置 Z20F35E630DAF399DFA8。 Then you can call this function from c++.然后你可以从 c++ 调用这个 function。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM