【问题标题】:QMl ListView elements to C++QMl ListView 元素到 C++
【发布时间】:2012-10-22 13:34:32
【问题描述】:

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

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

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

已编辑:

ma​​inwindow.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
}

【问题讨论】:

  • 也许你想给我们看一些你的代码
  • 另外,如果您有两个不相关的问题,最好在 stackoverflow 上发布两个问题,而不是合并它们。

标签: qt listview checkbox qml qlistwidget


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 首先,感谢您的回复。是的。我的清单中有很多项目。 (我正在显示联系人列表)。因此,正如您所建议的,我认为使用 C++ 是一个更好的主意,而不是使用 Qml ContactModel。但我不知道怎么做。我检查了那个链接。但是是否有任何链接可以通过示例来解释这些?
  • 我粘贴了我的代码。到目前为止,我试过这个。这样好吗?如何在我的 contacts.qml 页面中使用此模型?现在我去这个错误。 “ReferenceError:找不到变量:stdModel”
  • 您走在正确的轨道上,但是您会受到直接使用 QStandardItem 模型的限制,该模型中只能包含 QStandardItems。我建议将 QAbstractListModel 子类化,构建您自己的列表模式,并将自定义列表元素放入其中。 Check out this guy's blog here, where he does exactly this. 他解释了如何在 C++ 中制作自定义列表模型以及如何将其引入 QML。如果您想在每个项目中存储更多数据(选中/未选中),那么我建议您使用这种方法。
  • 尚未检查您的代码,但 stdModel 必须是 StdModel ... QML 有一些愚蠢的命名约定,请确保这是一个大写字母,但怀疑这是问题所在。 :P
  • 警告: 在该上下文中创建对象后设置上下文对象或添加新的上下文属性是一项昂贵的操作(实质上是强制所有绑定重新评估)。因此,只要有可能,您应该在使用它创建任何对象之前完成上下文的“设置”。 IE。在设置源之前设置上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多