我的SuperTable类继承了QTableView,而后者又继承了QAbstractItemView。
在某种程度上,QTableView的QScrollBar会发出一个触发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实现,这就是我想要断开的连接:
void QAbstractItemViewPrivate::init()
{
// (...)
QObject::connect(vbar, SIGNAL(valueChanged(int)),
q, SLOT(verticalScrollbarValueChanged(int)));
// (...)
}因为这是私人方面的事情,所以不确定这是否可能。有办法吗?
发布于 2016-12-20 17:29:41
如果模型的数据消失了,那么它就消失了,视图的任务就是通知用户这个事实。
如果你不想让数据消失,那就让它留下来,而不是对视图撒谎。视图可以在任何时候请求模型的数据(),而且您对视图的依赖在某种程度上是静止的,“如果”滚动条没有移动,这是不正确的。视图和保证这种行为的模型之间没有任何契约。
正确的方法是在模型和视图之间插入一个缓存代理视图模型。当源模型表明它不再有数据(可能表示重置或所有行被删除)时,代理将将自己的数据限制为最近缓存的连续行组,可能是查询有关可见行的视图。当然,每个视图都需要一个代理。
还请注意,如果您已经实现了您自己的模型,它并不表示为空,但以某种方式返回与data (或崩溃!)不同的值!没有发出相关的信号-你已经打破了一些无法修复的东西。模型的状态对任何外部观察者都是可见的,必须是一致的。
https://stackoverflow.com/questions/41247717
复制相似问题