当模型使用internalpointer()时,Qt重新实现QSortFilterProxyModel::data()

当模型使用internalpointer()时,Qt重新实现QSortFilterProxyModel::data(),qt,Qt,我有一个使用internalpointer()实现他的data()的书面模型(myModel)。 我想使用QSortFilterProxyModel过滤树(基于myModel) 只有当我试图从树中获取数据时,我的应用程序才会崩溃 我认为这是因为在调用树数据时,我希望得到myModel indexModel,而得到的是myQSortFilterProxyModelindexModel myItem *myModel::getItem(const QModelIndex &index) co

我有一个使用
internalpointer()
实现他的
data()
的书面模型(myModel)。 我想使用
QSortFilterProxyModel
过滤树(基于myModel)

只有当我试图从树中获取数据时,我的应用程序才会崩溃

我认为这是因为在调用树数据时,我希望得到myModel indexModel,而得到的是
myQSortFilterProxyModel
indexModel

myItem *myModel::getItem(const QModelIndex &index) const
{
    if (index.isValid()) {
        myItem *item = static_cast<myItem*>(index.internalPointer());
        if (item) return item;
    }
    return rootItem;
}
在myModel和树之间设置筛选器模型

void myTree::myInit()
{
...
    myModel *model = new myModel();
    proxyModel = new mySortFilterProxyModel(this);
    proxyModel->setSourceModel(model);
    this->setModel(proxyModel);
...
myTree是QTreeView子类。 我想使用
tree->model()
获取myModel


如何获取源模型数据?

基于您指出的原因,这种方法不适用于代理模型。 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
      ...
 }
enum角色{
MyItemRole=Qt::UserRole
};
QVariant数据(常量QModelIndex和索引,int角色)常量{
...   
如果(角色==MyItemRole)
返回QVariant::fromValue(项);
//MyItem或MyItem*,具体取决于是否可以复制/保存
//值语义与否
...
}
在使用代码时:

 const MyItem item = index.data( MyModel::MyItemRole ).value<MyItem>();
const MyItem=index.data(MyModel::MyItemRole.value();
您需要在头中声明元类型(MyItem)(或MyItem*),并在运行时调用qRegisterMetaType(),以便MyItem/MyItem*可以作为QVariant传递


这种方法的优点是,无论中间有什么代理模型,它都可以工作,而且代码调用数据甚至不必知道代理。

您所要做的就是在调用getItem()之前调用mapToSource()

下面是我用来更改特定项目类型字体的data()方法。否则它只调用QSortFilterProxyModel的data()


谢谢,但是我已经有一个使用内部指针的类,我知道这是错误的方法。。我找到了另一个解决方案,在这里我重写myTree::model()和myTrre::currentIndex()以提供myModel数据,而不是proxyModel数据。这对我来说更好,因为我不需要更改任何原始代码。
 const MyItem item = index.data( MyModel::MyItemRole ).value<MyItem>();
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);
}