在QML的listview中保存和检索选定项的列表

在QML的listview中保存和检索选定项的列表,listview,qml,Listview,Qml,我正在为Symbian使用Qt。在my Main Window.cpp中,我有一个QPushButton和一个QListWidget。按下按钮将显示一个Qml页面,该页面的每一行都有一个带有复选框的listview。我可以选中或取消选中项目。当我按下Back Tool按钮时,所选项目将列在主窗口的QListWidget中 当我重新打开Qml页面(即再次按下QPUSH按钮)时,我还需要检索包含所选项目的listview。如何做到这一点。?qml中是否有类似于saveState()或restoreS

我正在为Symbian使用Qt。在my Main Window.cpp中,我有一个QPushButton和一个QListWidget。按下按钮将显示一个Qml页面,该页面的每一行都有一个带有复选框的listview。我可以选中或取消选中项目。当我按下Back Tool按钮时,所选项目将列在主窗口的QListWidget中

当我重新打开Qml页面(即再次按下QPUSH按钮)时,我还需要检索包含所选项目的listview。如何做到这一点。?qml中是否有类似于saveState()或restoreState()的内容?如果没有,是否有其他可能的方法来实现这一点

编辑:

这是我的密码:

联系人。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
}
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();
}
void主窗口::createList()
{
QContactManager*contactManager=新的QContactManager(“symbian”);
QList contactIds=contactManager->contactIds();
QContact-currencontact;
QStandardItemModel*model=新QStandardItemModel();
QImage m_缩略图;
foreach(const QContactLocalId&id、ContactID)
{
currContact=contactManager->contact(id);
if(currContact.type()==QContactType::TypeContact)
{
QContactThumbnail化身(currContact.detail(QContactThumbnail::DefinitionName));
m_thumbnail=avatar.thumbnail();
QStandardItem*项=新的QStandardItem();
//items->setData(currContact.displayLabel(),Qt::DisplayRole);
//items->setData(QPixmap::fromImage(m_缩略图),Qt::DecorationRole);
items->setText(currContact.displayLabel());
if(m_缩略图.isNull())
{
项目->设置图标(联系人图标);
}
其他的
{
项目->设置图标(QPixmap::fromImage(m_缩略图));
}
模型->追加行(项目);
}
}
}
void主窗口::viewQml()
{
QDeclarativeView*qmlView=新的QDeclarativeView;
qmlView->setSource(qrl(“qrc:/contacts.qml”);
qmlView->rootContext()->setContextProperty(“stdModel”,model);
qmlView->show();
}

如果使用QML CalcTeMaMo作为模型,那么您应该创建一个单独的C++模型并在模型中保存状态。

C++类的例子:

class CheckedModel : public QObject
{
  Q_OBJECT
public:
  CheckedModel(QObject *parent);
  Q_INVOKABLE void setSize(int count) {vector.resize(count)};
  Q_INVOKABLE bool isChecked(int index) {return vector[index]};
  Q_INVOKABLE void check(int index, bool checked) {vector[index] = checked};
private:
  std::vector<bool> vector;
};
最后一件事是从QML使用它:

ListView {
  id: listView
  model: contactModel
  delegate: contactListDelegate
  onCountChanged: {
    theCheckedModel.setSize(count);
  }
}
在鼠标区域中,请对您的代表执行以下操作:

onClicked: {
  if(selectbox.checked == false)
  {
    selectbox.checked = true
    theCheckedModel.check(index, true);
  }
  else if(selectbox.checked == true)
  {
    selectbox.checked = false
    theCheckedModel.check(index, true);
  }
}
最后一件事是将其加载到复选框:

CheckBox {
  id: selectbox
  Component.onComplete{
    selectbox.checked = theCheckedModel.isChecked(index);
  }
}

请注意,his只是您需要做的主要事情,可能不会立即编译。如果你还有问题,请告诉我。希望它有帮助。

< P>如果你使用QML CalcTeMaMo作为模型,那么你应该创建一个单独的C++模型并在模型中保存状态。

C++类的例子:

class CheckedModel : public QObject
{
  Q_OBJECT
public:
  CheckedModel(QObject *parent);
  Q_INVOKABLE void setSize(int count) {vector.resize(count)};
  Q_INVOKABLE bool isChecked(int index) {return vector[index]};
  Q_INVOKABLE void check(int index, bool checked) {vector[index] = checked};
private:
  std::vector<bool> vector;
};
最后一件事是从QML使用它:

ListView {
  id: listView
  model: contactModel
  delegate: contactListDelegate
  onCountChanged: {
    theCheckedModel.setSize(count);
  }
}
在鼠标区域中,请对您的代表执行以下操作:

onClicked: {
  if(selectbox.checked == false)
  {
    selectbox.checked = true
    theCheckedModel.check(index, true);
  }
  else if(selectbox.checked == true)
  {
    selectbox.checked = false
    theCheckedModel.check(index, true);
  }
}
最后一件事是将其加载到复选框:

CheckBox {
  id: selectbox
  Component.onComplete{
    selectbox.checked = theCheckedModel.isChecked(index);
  }
}

请注意,his只是您需要做的主要事情,可能不会立即编译。如果你还有问题,请告诉我。希望能有所帮助。

谢谢您的回复。但我不明白。“将状态保存为模型的一部分”是什么意思?如果可能的话,你能不能显示一段代码?你使用QML还是C++?将新角色/属性添加到模型中,并在单击复选框时更改该属性的值。实际上,我使用“联系人模型”作为listview的模型。我还有一个自定义委托作为组件。当然,我正在显示联系人列表。是QML模型吗?如果是,您可以使用“修改”字段来存储是否已选中(不确定是否有效)。另一个更困难的解决方案是尝试编写自己的模型。listitem具有图像(联系人化身)、listitemtext(联系人名称)和复选框。鼠标earea填充列表项。单击列表项,用户可以选中或取消选中复选框。感谢您的回复。但我不明白。“将状态保存为模型的一部分”是什么意思?如果可能的话,你能不能显示一段代码?你使用QML还是C++?将新角色/属性添加到模型中,并在单击复选框时更改该属性的值。实际上,我使用“联系人模型”作为listview的模型。我还有一个自定义委托作为组件。当然,我正在显示联系人列表。是QML模型吗?如果是,您可以使用“修改”字段来存储是否已选中(不确定是否有效)。另一个更困难的解决方案是尝试编写自己的模型。listitem具有图像(联系人化身)、listitemtext(联系人名称)和复选框。鼠标earea填充列表项。单击listitem后,用户可以选中或取消选中该复选框。请尝试将setcontextproperty放在set source之前,这样可以解决找不到引用的问题。尝试将setcontextproperty放在set source之前,这样可以解决找不到引用的问题。