0

如何在 QML ListView 中选择一些元素并将所选 ListItemText 的列表发送到 C++ 中的 QListWidget?

我使用“联系人模型”作为 ListView 的模型。该组件有一个 ListItem。ListItem 有一个 Image(联系人头像)、一个 ListItemText(联系人姓名)和一个 CheckBox。MouseArea 填充 ListItem。在单击 ListItem 时,我可以选中或取消选中 CheckBox。

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

编辑:

主窗口.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

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
}
4

1 回答 1

1

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

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

“代表会根据需要进行实例化,并且可能随时被销毁。状态永远不应该存储在代表中。”

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

如果您想在代理滚动出视图时保留它,您可以查看缓存代理。您可以通过增加 QML 列表视图的 cacheBuffer 大小来缓存代理滚动出视图。但是,请注意,如果列表中有很多项目,则增加 cacheBuffer 不是一个好主意。您将耗尽内存。一个更好的主意是使用 C++ 实现您的列表视图和列表视图模型。如果您不明白我的意思,请查看QAbstractListModel 类

于 2012-10-23T20:49:56.923 回答