3

internalpointer()私は彼のdata()実装に使用するモデル (myModel) を作成しました。QSortFilterProxyModelを使用して (myModel に基づいて) ツリーをフィルター処理したい

ツリーからデータを取得しようとすると、アプリがクラッシュします。

ツリー データを呼び出しているときに、myModel indexModel を取得することを期待して、indexModel を取得したためだと思いますmyQSortFilterProxyModel

myItem *myModel::getItem(const QModelIndex &index) const
{
    if (index.isValid()) {
        myItem *item = static_cast<myItem*>(index.internalPointer());
        if (item) return item;
    }
    return rootItem;
}

data()使用している myModelinternalPointer()

QVariant myModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role != Qt::DisplayRole && role != Qt::EditRole)
        return QVariant();

    myItem *item = getItem(index);

    return item->data(index.column());
}

myModel とツリーの間でフィルター モデルを設定する

void myTree::myInit()
{
...
    myModel *model = new myModel();
    proxyModel = new mySortFilterProxyModel(this);
    proxyModel->setSourceModel(model);
    this->setModel(proxyModel);
...

myTree は QTreeView サブクラスです。tree->model()myModel モデルを取得するために使用したい

ソース モデル データを取得するにはどうすればよいですか?

4

2 に答える 2

1

あなたが指摘した理由により、このアプローチはプロキシモデルでは機能しません。Internalpointer/id は、 data() などのように、モデル自体に属する渡されたインデックスを取得することが保証されているメソッドでのみアクセスする必要があります。

インデックスの項目を取得するためのより良い方法は、カスタム ロールを介して渡すことです。

 enum Roles {
     MyItemRole=Qt::UserRole
 };

 QVariant data( const QModelIndex& index, int role ) const {
      ...   
      if ( role == MyItemRole )
          return QVariant::fromValue<MyItem>( item ); 
         //MyItem or MyItem*, depending on whether it can be copied/has
         // value semantics or not
      ...
 }

コードを使用する場合:

 const MyItem item = index.data( MyModel::MyItemRole ).value<MyItem>();

MyItem/MyItem* を QVariant として渡すことができるように、ヘッダーで Q_DECLARE_METATYPE(MyItem) (または MyItem*) を実行し、qRegisterMetaType() を呼び出す必要があります。

このアプローチには、中間のプロキシ モデルに関係なく機能するという利点があり、データを呼び出すコードはプロキシについて知る必要さえありません。

于 2013-01-20T23:20:16.340 に答える
1

getItem() を呼び出す前に mapToSource() を呼び出すだけです。

特定の種類の項目のフォントを変更するために使用する data() メソッドを次に示します。それ以外の場合は、QSortFilterProxyModel の data() を呼び出すだけです。

virtual QVariant data(const QModelIndex & proxy_index, int role) const
{
    QModelIndex source_index = mapToSource(proxy_index);
    IT::TreeItem * item = IT::toItem(source_index);
    if (role == Qt::FontRole && item->isMessage()) return _bold_font;
    return QSortFilterProxyModel::data(proxy_index, role);
}
于 2013-06-18T16:22:42.150 に答える