1

Qt for Symbian を使用しています。私の mainwindow.cpp には、QPushButton と QListWidget があります。ボタンを押すと、各行にチェックボックスがあるリストビューを持つ Qml ページが表示されます。アイテムをチェックまたはチェック解除できます。[戻る] ツールボタンを押すと、選択した項目がメイン ウィンドウの QListWidget に一覧表示されます。

Qml ページを再度開くと (つまり、QPushButton をもう一度押すと)、選択したアイテムを含むリストビューも取得する必要があります。それを達成する方法。qmlにsaveState()やrestoreState()のようなものはありますか? そうでない場合、これを達成するための他の方法はありますか?

編集:

これが私のコードです:

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

メインウィンドウ.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();
}
4

1 に答える 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);
  }
}

これは、実行する必要がある主な事項にすぎず、すぐにコンパイルできない可能性があることに注意してください。問題が解決しない場合はお知らせください。うまくいけば、それは役に立ちます。

于 2012-10-15T10:44:18.527 に答える