gpt4 book ai didi

qt - 如何从 C++ 访问 QML ListView 委托(delegate)项?

转载 作者:行者123 更新时间:2023-12-05 02:21:01 24 4
gpt4 key购买 nike

Listview 中,我使用“delegate”弹出了 100 个项目,假设 listview 已经显示填充值。 现在我想从 C++ 中提取 QML ListView 中已经显示的值。如何做到这一点?笔记:我不能直接访问数据模型,因为我在委托(delegate)中使用隐藏变量进行过滤

        /*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树轻松找到testingItem使用 QObject::findChild 的 QML 根项:

//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 父项。例如,ListViewRepeater 中的委托(delegate):

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 中的委托(delegate),我们必须搜索 visual child 而不是子对象。 ListView 代表是 ListView 的 contentItem 的父级。所以在 C++ 中,我们必须首先搜索 ListView(使用 QObject::findChild),然后使用 QQuickItem::childItemscontentItem 中搜索委托(delegate):

//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");
}
}

关于qt - 如何从 C++ 访问 QML ListView 委托(delegate)项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com