我正在使用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();
}
答案 0 :(得分: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);
}
}
请注意,他只是您需要做的主要事情,可能无法立即编译。如果您还有问题,请告诉我。希望它有所帮助。