Qt 如何从C++;?

Qt 如何从C++;?,qt,qml,qt5,qtquick2,qtquickcontrols,Qt,Qml,Qt5,Qtquick2,Qtquickcontrols,在Listview中,我使用“委托”弹出了100个项目,假设Listview已经显示了填充的值现在我想从C++中提取QML列表视图中已经显示的值。。如何做到这一点? 注: 我无法直接访问数据模型,因为我在委托中使用隐藏变量进行过滤 /*这不是工作代码,请注意, 委托不会显示所有模型数据*/ 列表视图 { id:“列表视图” 模型:数据模型 代表:{ 如果(!隐藏) { 文本{ 文本:值 } } } //我可以使用给定的方法访问吗? QObject*object=m_qmlengine->root

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

/*这不是工作代码,请注意,
委托不会显示所有模型数据*/
列表视图
{
id:“列表视图”
模型:数据模型
代表:{
如果(!隐藏)
{
文本{
文本:值
}
}
}
//我可以使用给定的方法访问吗?
QObject*object=m_qmlengine->rootObjects().at(0)->findChild(“listview”);
//查找对象
const QListObject&lists=object->children();
//0以计数最大值
//读取第一个属性
QVarient value=QQmlProperty::read(列出[0],“文本”);

<代码> > p>您可以在<强> >属性> /强>中搜索QML中的特定项。让我们来看一个简单的qML文件:

//main.qml
Window {
    width: 1024; height: 768; visible: true
    Rectangle {
        objectName: "testingItem"
        width: 200; height: 40; color: "green"
    }
}
< > >在C++中,假设<代码>引擎< /C>是加载Maun.QML的<代码> QQmlApplicationEngine <代码>,我们可以通过使用QML根项目搜索QObjt树来轻松找到<代码>测试项< /C> >: <> >在 ListVIEW/COD>中,我们必须搜索对象Sobe,而对ListVIEW的代码> CONTITENTS/COD>进行了代理。因此,在C++中,我们必须首先搜索<代码> ListVIEW < /C> >(使用<代码> QObj::FoDDHOI< <代码> >,然后使用

搜索<代码> CONTENTISOR> <代码>中的委托。
/C++
无效UIControl::printTestingItemColorInListView()
{
自动查看=m_rootObj->findChild(“查看”);
自动contentItem=查看->属性(“contentItem”).value();
自动contentItemChildren=contentItem->childItems();
用于(自动子项:contentItemChildren)
{
如果(childItem->objectName()=“testingItem”)
qDebug()属性(“颜色”);
}
}

至少应该使用一个代码,也可以从C++到QML,当然,在这种情况下,如果你想在C++侧使用模型数据,使用C++模型。我正在做自动化测试,我不能用模型数据来验证,所以在QML中显示列表视图之后,我需要从Q中提取数据。ML+C++和验证。我怀疑它会像你所期望的那样工作,你将有更好的机会在QML迭代ListVIEW,并将文本发送给C++,将其传递给一个时隙函数。因为我正在做自动化测试,所以我不需要在QML上编辑/触摸,而是使用QML插件,这样应用程序不会受到自动化测试代码的干扰。QML中的测试:
//main.qml
Window {
    width: 1024; height: 768; visible: true
    Rectangle {
        objectName: "testingItem"
        width: 200; height: 40; color: "green"
    }
}
//C++
void printTestingItemColor()
{
    auto rootObj = engine.rootObjects().at(0); //assume main.qml is loaded
    auto testingItem = rootObj->findChild<QQuickItem *>("testingItem");
    qDebug() << testingItem->property("color");
}
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
    }
}
//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");
    }
}