在列表视图中,我使用"委托"弹出了 100 个项目,假设列表视图已经显示了填充值。现在我想从C++中提取 QML 列表视图中已经显示的值。如何实现这一点?注意:我无法直接访问数据模型,因为我正在使用隐藏变量在委托中进行过滤
/*This is not working code, Please note,
delegate will not display all model data.*/
ListView
{
id:"listview"
model:datamodel
delegate:{
if(!hidden)
{
Text{
text:value
}
}
}
//Can I access by using given approach?
QObject * object = m_qmlengine->rootObjects().at(0)->findChild<QObject* >("listview");
//Find objects
const QListObject& lists = object->children();
//0 to count maximum
//read the first property
QVarient value = QQmlProperty::read(lists[0],"text");
objectName
属性在 QML 中搜索特定项目。让我们看一个简单的 QML 文件:
//main.qml
Window {
width: 1024; height: 768; visible: true
Rectangle {
objectName: "testingItem"
width: 200; height: 40; color: "green"
}
}
在C++中,假设engine
是加载main.qml的QQmlApplicationEngine
,我们可以通过使用QObject::findChild
从QML根项中搜索QObject树来轻松找到testingItem
:
//C++
void printTestingItemColor()
{
auto rootObj = engine.rootObjects().at(0); //assume main.qml is loaded
auto testingItem = rootObj->findChild<QQuickItem *>("testingItem");
qDebug() << testingItem->property("color");
}
但是,此方法无法在 QML 中找到所有项目,因为某些项目可能没有 QObject 父项。例如,ListView
或Repeater
中的代表:
ListView {
objectName: "view"
width: 200; height: 80
model: ListModel { ListElement { colorRole: "green" } }
delegate: Rectangle {
objectName: "testingItem" //printTestingItemColor() cannot find this!!
width: 50; height: 50
color: colorRole
}
}
对于 ListView
中的委托,我们必须搜索可视子项而不是对象子项。 ListView
代理都属于 ListView 的contentItem
的父级。所以在C++中,我们必须首先搜索ListView
(使用 QObject::findChild
),然后使用 QQuickItem::childItems
在 contentItem
中搜索委托:
//C++
void UIControl::printTestingItemColorInListView()
{
auto view = m_rootObj->findChild<QQuickItem *>("view");
auto contentItem = view->property("contentItem").value<QQuickItem *>();
auto contentItemChildren = contentItem->childItems();
for (auto childItem: contentItemChildren )
{
if (childItem->objectName() == "testingItem")
qDebug() << childItem->property("color");
}
}