我正在尝试从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);
如何实现这一目标?或者任何人都可以建议我更好的方法来实现它?谢谢!
答案 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"));