首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从父类QAbstractItemView断开连接槽

从父类QAbstractItemView断开连接槽
EN

Stack Overflow用户
提问于 2016-12-20 17:08:46
回答 1查看 131关注 0票数 2

我的SuperTable类继承了QTableView,而后者又继承了QAbstractItemView

在某种程度上,QTableViewQScrollBar会发出一个触发QAbstractItemView::verticalScrollbarValueChanged(int)插槽的信号。

对于我的应用程序来说,这一点很重要,这是不发生的,所以我想断开QAbstractItemView中的那个插槽,但是我还没有找到从SuperTable访问它的方法。

编辑/

我正在尝试实现的:表模型的数据不再可用,但我想保持对话框与QTableView和它已经包含的数据,可用。但是我不能调用它的data()方法,因为我再也没有什么可返回的了。在大多数情况下,我已经完成了这一任务,但有一个很大的例外:每当使用鼠标在单元格上滚动表时,就会发生以下情况:

myApp::SuperTable::data(QModelIndex const& int) const QSortFilterProxyModel::data(QModelIndex const&,int) const QAbstractItemViewPrivate::checkMouseMove(QPersistentModelIndex const&) QAbstractItemView::verticalScrollbarValueChanged(int) QMetaObject::activate(QObject*,QMetaObject const*,int,void**) QAbstractSlider::valueChanged(int)

/edit

更具体地说,看看Qt的qabstractitemview.cpp实现,这就是我想要断开的连接:

代码语言:javascript
复制
void QAbstractItemViewPrivate::init()
{
    // (...)
    QObject::connect(vbar, SIGNAL(valueChanged(int)),
                     q, SLOT(verticalScrollbarValueChanged(int)));
    // (...)
}

因为这是私人方面的事情,所以不确定这是否可能。有办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-20 17:29:41

如果模型的数据消失了,那么它就消失了,视图的任务就是通知用户这个事实。

如果你不想让数据消失,那就让它留下来,而不是对视图撒谎。视图可以在任何时候请求模型的数据(),而且您对视图的依赖在某种程度上是静止的,“如果”滚动条没有移动,这是不正确的。视图和保证这种行为的模型之间没有任何契约。

正确的方法是在模型和视图之间插入一个缓存代理视图模型。当源模型表明它不再有数据(可能表示重置或所有行被删除)时,代理将将自己的数据限制为最近缓存的连续行组,可能是查询有关可见行的视图。当然,每个视图都需要一个代理。

还请注意,如果您已经实现了您自己的模型,它并不表示为空,但以某种方式返回与data (或崩溃!)不同的值!没有发出相关的信号-你已经打破了一些无法修复的东西。模型的状态对任何外部观察者都是可见的,必须是一致的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41247717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档