Qt QMl ListView元素到C++; < >如何在QML ListVIEW中选择几个元素,并将选定的ListITEM文本列表发送到C++中的QListWidget?< /P>

Qt QMl ListView元素到C++; < >如何在QML ListVIEW中选择几个元素,并将选定的ListITEM文本列表发送到C++中的QListWidget?< /P>,qt,listview,checkbox,qml,qlistwidget,Qt,Listview,Checkbox,Qml,Qlistwidget,我使用“联系人模型”作为ListView的模型。该组件有一个ListItem。ListItem具有图像(联系人化身)、ListItemText(联系人名称)和复选框。鼠标earea填充列表项。单击ListItem后,我可以选中或取消选中复选框 另外,我还有一个问题。在检查了几个元素之后,如果ListView有一个移动(即,当我向上或向下滚动时),那么所有选定的元素都将自动取消选中 编辑: main window.cpp void MainWindow::createList() { QConta

我使用“联系人模型”作为ListView的模型。该组件有一个ListItem。ListItem具有图像(联系人化身)、ListItemText(联系人名称)和复选框。鼠标earea填充列表项。单击ListItem后,我可以选中或取消选中复选框

另外,我还有一个问题。在检查了几个元素之后,如果ListView有一个移动(即,当我向上或向下滚动时),那么所有选定的元素都将自动取消选中

编辑:

main window.cpp

void MainWindow::createList()
{
QContactManager *contactManager = new QContactManager("symbian");    
QList<QContactLocalId> contactIds = contactManager->contactIds();
QContact currContact;
QStandardItemModel *model = new QStandardItemModel();
QImage m_thumbnail;

foreach (const QContactLocalId& id, contactIds)
{
    currContact = contactManager->contact(id);
    if(currContact.type() == QContactType::TypeContact)
    {
        QContactThumbnail avatar(currContact.detail(QContactThumbnail::DefinitionName));
        m_thumbnail = avatar.thumbnail();

        QStandardItem *items = new QStandardItem();
        //items->setData(currContact.displayLabel(), Qt::DisplayRole);
        //items->setData(QPixmap::fromImage(m_thumbnail), Qt::DecorationRole);
        items->setText(currContact.displayLabel());

        if(m_thumbnail.isNull())
        {
            items->setIcon(contactIcon);
        }
        else
        {
            items->setIcon(QPixmap::fromImage(m_thumbnail));
        }
        model->appendRow(items);
    }
}
}

void MainWindow::viewQml()
{
        QDeclarativeView *qmlView = new QDeclarativeView;
        qmlView->setSource(QUrl("qrc:/contacts.qml"));
        qmlView->rootContext()->setContextProperty("stdModel", model);
        qmlView->show();
}

首先,请提供一些代码,以便我们能够更好地了解您正在尝试实现的目标以及您已经尝试过的目标

关于第二个问题,当您上下滚动时,选中的元素将被取消选中,因为正如文档所述:

“委托将根据需要实例化,并可随时销毁。 状态不应存储在委托中。”

因此,当您的委托被滚动出视图时,它很可能会被销毁,当它返回视图时,它将以未选中的默认状态创建


如果您希望在将委托滚动出视图时保留该委托,则可以签出缓存委托。通过增加QML列表视图的cacheBuffer大小,可以在代理从视图中滚出时缓存代理但是,如果列表中有许多项,则增加缓存缓冲区不是一个好主意。您将耗尽内存。一个更好的想法是用C++实现清单视图和列表视图模型。< /强>如果你不理解我的意思,请检查.< /p>也许你想给我们展示一些你的代码,如果你有两个无关的问题,最好在STACKOFFAST上加两个问题而不是组合它们。谢谢你的回复。对我的清单上有很多项目。(我正在显示联系人列表)。因此,我认为C++不是一个更好的主意,而不是使用QML CalcTeMod。但我不知道怎么做。我检查了那个链接。但是有没有链接可以用例子来解释这些呢?我粘贴了我的代码。到目前为止,我试过这个。可以吗?如何在我的contacts.qml页面中使用此模型?现在我来看看这个错误。“ReferenceError:找不到variable:stdModel”您的思路是正确的,但是直接使用QStandardItem模型(其中只能包含QStandardItem)会有一定的限制。我建议将QAbstractListModel子类化,构建自己的列表模式,并将自定义列表元素放入其中。他解释了如何在C++中制作自定义列表模型以及如何将其转换到QML。如果您想在每个项目中存储更多数据(选中/未选中),那么我建议使用这种方法。尚未检查您的代码,但stdModel必须是stdModel。。。QML有一些愚蠢的命名约定,确保这是一个大写字母,但怀疑这是问题所在PWarning:在上下文中创建对象后设置上下文对象或添加新的上下文属性是一项昂贵的操作(实际上是强制所有绑定重新评估)。因此,只要有可能,您应该在使用上下文创建任何对象之前完成上下文的“设置”。即,在设置源之前设置上下文。
ListView {
id: listView
anchors.top: statusBar.bottom
anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: toolBar.top
clip: true
model: stdModel
//delegate: contactListDelegate
}