QMl ListView元素到C ++

时间:2012-10-22 13:34:33

标签: qt listview checkbox qml qlistwidget

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

我正在使用'contact model'作为ListView的模型。该组件具有ListItem。 ListItem有一个Image(联系人头像),一个ListItemText(联系人的名字)和一个CheckBox。 MouseArea填充ListItem。单击ListItem,我可以选中或取消选中CheckBox。

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

编辑:

mainwindow.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();
}

contacts.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
}

1 个答案:

答案 0 :(得分:1)

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

关于第二个问题,当您向上和向下滚动时,所选元素将被取消选中,因为文档说明:

  

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

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

如果您希望在滚出视图时保留代理,则可以查看缓存代理。通过增加QML列表视图的cacheBuffer大小,可以在将代理滚动到视图外时对其进行缓存。 但是,请注意,如果列表中有许多项目,则增加cacheBuffer并不是一个好主意。你的内存不足。更好的想法是使用C ++实现列表视图和列表视图模型。如果您不明白我的意思,请查看QAbstractListModel class