0

QML ListView でいくつかの要素を選択し、選択した ListItemText のリストを C++ の QListWidget に送信するにはどうすればよいですか?

ListView のモデルとして「連絡先モデル」を使用しています。コンポーネントには ListItem があります。ListItem には、Image (連絡先のアバター)、ListItemText (連絡先の名前)、および CheckBox があります。MouseArea は ListItem を満たします。ListItem をクリックすると、CheckBox をオンまたはオフにできます。

また、もう1つ問題があります。いくつかの要素をチェックした後、ListView に動きがある場合 (つまり、上下にスクロールすると)、選択したすべての要素が自動的にチェック解除されます。

編集:

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

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
}
4

1 に答える 1

1

まず、あなたが達成しようとしていることと、あなたがすでに試したことをよりよく理解できるように、いくつかのコードを提示してください。

2番目の問題に関しては、上下にスクロールすると、ドキュメントに記載されているように、選択した要素がチェックされていません。

「デリゲートは必要に応じてインスタンス化され、いつでも破棄される可能性があります。状態はデリゲートに格納されるべきではありません。」

したがって、デリゲートがスクロールされて表示されなくなると破棄される可能性が高く、表示に戻るとデフォルトの状態でチェックされていない状態で作成されます。

デリゲートがスクロールして表示されなくなったときにデリゲートを保持したい場合は、キャッシング デリゲートをチェックアウトできます。QML リスト ビューの cacheBuffer サイズを大きくすることで、デリゲートがスクロールされて表示されなくなったときにデリゲートをキャッシュできます。ただし、リストに多くの項目がある場合、cacheBuffer を増やすのは得策ではありません。メモリ不足になります。C++ を使用してリスト ビューとリスト ビュー モデルを実装することをお勧めします。これが何を意味するのか理解できない場合は、QAbstractListModel クラスを調べてください。

于 2012-10-23T20:49:56.923 に答える