1

QTreeWidgetからへの移行に問題がありますQtreeView。明白で些細なことはQTreeWidget、ビューでは不可能に思えます。具体的には、ツリービューを含むメイン ウィンドウがあります。TreeView は、私が実装したモデルを使用しますが、直接QSortFilterProxyModelではなく、ツリーのモデルとして設定されます。ここで、ユーザーがツリー内の項目をアクティブにすると、メイン ウィンドウがシグナルを受信しますitemActivated(QModelIndex item)。基になるデータのどのアイテムがアクティブ化されたかをどのように確認できますか? データはベクターなので、TreeWidget を使用すると、アイテムのベクター インデックスを に格納できますが、QTreeWidgetItemAPIさえQModelIndexありません。setData

4

3 に答える 3

2

基になるデータのどのアイテムがアクティブ化されたかをどのように確認できますか?

プロキシ モデルを逆にすることによって:

// supposing to connect this to your itemActivated signal
void onItemActivated(const QModelIndex &index)
{
    QModelIndex originalIndex = proxyModel->mapToSource(index);
    originalModel->doSomething(originalIndex);
}
于 2013-09-22T08:42:12.920 に答える
1

ソース モデルでカスタム ロールを定義して、基になるデータまたは識別子 (存在する場合) をバリアントとして返すことができます。これには、間にある任意の数のプロキシ モデルで機能するという利点があります。データは変更されずにモデルを通過し、インデックスのマッピングが必要になるからです。

Contactデータを保持する構造体/クラスの値を使用して、連絡先をリストするモデルを想定しています。これはContact、経由で登録する必要がありますQ_DECLARE_METATYPE

class ContactModel ... {
    ...

    enum Role {
        ContactRole=Qt::UserRole,
        ContactIdRole
    };

    QVariant data(...) const {
        ...
        const Contact& contact = ...get from datastructure...
        ...
        switch (role) {
        ...
        case ContactRole:
             return QVariant::fromValue( contact );
        case ContactIdRole:
             return contact.id;
        }
    }
    ...

インデックスを受け取るコードでは、次のようになります。

void SomeWidget::indexSelected(const QModelIndex& index)
{
    const int id = index.data(ContactModel::ContactIdRole).toInt();
    // look up Contact, do something with it

    //or:

    const Contact contact = index.data(ContactModel::ContactRole).value<Contact>();
    // do something with the contact

    ...
}

インデックスは、コンタクト モデル自体、またはその上の任意のプロキシから取得できます。ここのコードは気にする必要はありません。

于 2013-09-22T12:19:26.237 に答える
0

データを格納するモデル。データはアイテムによって所有されなくなりましQModelIndexた/ ビュー内。QModelIndexは、ビューとモデルの間で (この場合は を介し​​てQSortFilterProxyModel) 渡される一意の識別子にすぎません。モデルは、定義する必要があるいくつかの純粋な仮想関数を継承する必要があります (ボイラープレートはhttp://qt-project.org/doc/qt-4.8/itemviews-simpletreemodel.htmlQAbstractItemModelからコピーできます)。たとえば、どのデータが特定の に対応するかを定義する必要があります。QAbstractItemModel::data( const QModelIndex & index, int role = Qt::DisplayRole)QModelIndex

QSortFilterProxyModel はビューとモデルの間に位置しますが、モデルの原則を変更しません。QModelIndex変換の処理方法については、この質問に関する他の回答を参照してください。

結論QAbstractItemModel::data( const QModelIndex & index)として、特定のデータを定義すると、特定のデータが提供QModelIndexされます。

于 2013-09-22T10:47:05.683 に答える