- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 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 data()
使用 internalPointer()
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 模型
如何获取源模型数据?
最佳答案
由于您指出的原因,这种方法不适用于代理模型。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>();
您需要在 header 中 Q_DECLARE_METATYPE(MyItem)(或 MyItem*)并在运行时调用 qRegisterMetaType(),以便 MyItem/MyItem* 可以作为 QVariant 传递。
这种方法的优点是无论中间有任何代理模型,它都可以工作,并且调用数据的代码甚至不需要知道代理。
关于Qt 在模型使用 internalpointer() 时重新实现 QSortFilterProxyModel::data(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14422267/
我有一个使用 internalpointer() 实现他的 data() 的书面模型 (myModel)。我想使用 QSortFilterProxyModel 过滤一棵树(基于 myModel), 我
我是一名优秀的程序员,十分优秀!