从C ++更改QML Listview委托

时间:2016-09-14 02:23:42

标签: c++ listview qml qtquick2

我正在尝试从C ++更改qml listview的委托,但目前我坚持如何更改代表委托属性的别名。

详情更新 我在分开的qml文件中有多个委托,在我的应用程序中有很多屏幕,每个屏幕都有不同的listview UI,我想要的是:

将委托文件名传递给C ++函数>>> C ++函数设置listView的委托属性(或类似的东西)>>> listview加载相应的委托。

我的qml文件如下:

Item {
    id: root
    property alias listViewDelegate: listView.delegate

    ListView{
        id: listView
        delegate: MyDelegate{} // I have MyDelegate.qml file, it's working well
        model: listModel
    }

    // List model
    MyListModel {
        id: listModel
    }
}

我尝试使用setProperty()方法从C ++更改listViewDelegate别名,但没有运气(事实上是错误的)。

qmlObj->setProperty("listViewDelegate", componentDelegate);

如何实现这一目标?或者任何人都可以建议我更好的方法来实现它?谢谢!

3 个答案:

答案 0 :(得分:2)

我认为有更好的方法可以做到这一点。

步骤:

1)在c ++端创建一个模型。

class Model : public QObject {
  Q_OBJECT
  Q_PROPERTY(qint32 status READ status WRITE setStatus NOTIFY statusChanged)
public:
  Model(QObject *parent = Q_NULLPTR);
  ...
}

2)通过setContextProperty将模型对象传递给qml

Model model;
engine.rootContext()->setContextProperty("model1", &model);

3)在Model.status

上绑定ListView的委托
ListView {
    id: listview
    anchors.fill: parent
    spacing: 20
    model: listmodel
    delegate: model1.status === 0 ? delegate1 : delegate2
}

4)现在你可以通过c ++方面的setStaus()更改委托。

model.setStatus(1);

答案 1 :(得分:2)

必须将属性listViewDelegate分配给ListView,以便在修改ListViewDelegate属性时,将通知ListView并更新委托。

Item {
    id: root
    property Component listViewDelegate: myDelegate

    MyDelegate { 
          id:  myDelegate
    }

    ListView{
        id: listView
        delegate: listViewDelegate
        model: listModel
    }

    // List model
    MyListModel {
        id: listModel
    }
}

答案 2 :(得分:0)

感谢大家,我只想通过使用javascript找到一种方法,看起来很复杂,但它确实有效。

我将这个javascript函数添加到我的根项

function loadListViewDelegate(file){
    var component = Qt.createComponent(file);
    if(component && (component.status === Component.Ready))
    {
        listView.delegate = component;
        return file;
    }
    return "";
}

然后我从C ++调用此函数,参数是委托qml文件。它看起来像这样:

QMetaObject::invokeMethod(qmlObj, "loadListViewDelegate", Q_RETURN_ARG(QVariant, returnedValue), Q_ARG(QVariant, "delegate_screen_home.qml"));

How to invoke qml javascript method