当模型使用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);
}