首页 文章

在QML中保存和检索列表视图中所选项目的列表

提问于
浏览
1

我正在使用Qt for Symbian . 在我的mainwindow.cpp中,我有一个QPushButton和一个QListWidget . 按下按钮将显示一个Qml页面,其中包含每行中带有复选框的列表视图 . 我可以选中或取消选中这些项目 . 当我按下后退工具按钮时,所选项目将列在主窗口的QListWidget中 .

当我重新打开Qml页面(即再次按下QPushButton)时,我还需要检索包含所选项目的列表视图 . 如何实现这一目标 . 在qml中有类似saveState()或restoreState()的东西吗?如果没有,有没有其他可能的方法来实现这一目标?

编辑:

这是我的代码:

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
}

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

1 回答

  • 1

    如果您使用QML ContactModel作为模型,那么您应该创建一个单独的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 .

    CheckedModel myModel;
    QDeclarativeView view;
    view.rootContext()->setContextProperty("theCheckedModel", &myModel);
    view.setSource(QUrl::fromLocalFile("yourqmlfile.qml"));
    view.show();
    

    然后最后一件事是从QML中使用它:

    ListView {
      id: listView
      model: contactModel
      delegate: contactListDelegate
      onCountChanged: {
        theCheckedModel.setSize(count);
      }
    }
    

    在代理的MouseArea中执行以下操作:

    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);
      }
    }
    

    请注意,他只是您需要做的主要事情,可能无法立即编译 . 如果您还有问题,请告诉我 . 希望它有所帮助 .

相关问题