断开插槽与父级 class QAbstractItemView

Disconnect slot from parent class QAbstractItemView

我的 SuperTable class 继承自 QTableView,后者又继承自 QAbstractItemView.

在某些时候,QTableViewQScrollBar 会发出触发 QAbstractItemView::verticalScrollbarValueChanged(int) 插槽的信号。

对于我的应用程序,重要的是这不会发生,所以我想断开 QAbstractItemView 中的那个插槽,但我一直无法找到一种方法来访问它SuperTable.

编辑/

我想要实现的目标:table 模型的数据不再可用,但我想保留与 QTableView 的对话框及其数据已经包含,可用。但是我不能调用它的 data() 方法,因为我没有任何东西可以 return 了。 在大多数情况下,我已经完成了这一点,但有一个很大的例外:每当用鼠标在单元格上滚动 table 时,就会发生以下情况:

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)

/编辑

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

void QAbstractItemViewPrivate::init()
{
    // (...)
    QObject::connect(vbar, SIGNAL(valueChanged(int)),
                     q, SLOT(verticalScrollbarValueChanged(int)));
    // (...)
}

由于它涉及到事物的私密性,所以不确定这是否可能。 有办法吗?

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

如果你不想让数据消失,那就让它留下而不是躺在视图上。视图可以随时请求模型的数据,并且您对视图的依赖是静止的"if only" 滚动条不移动是不正确的。视图和模型之间没有保证此类行为的契约。

正确的做法是在模型和视图之间插入一个缓存代理视图模型。当源模型指示它不再有数据时(它可能发出重置信号或指示所有行都已删除),代理会将其自己的数据限制为某个最近缓存的连续行组,可能会查询视图是否可见行。当然,您希望每次观看一个代理。

另请注意,如果您实现了自己的模型,该模型并不表示为空,但不知何故 returns 与 data 不同的值(或崩溃!)而没有发出相关信号 - 您已经坏得无法修复。对于任何外部观察者可见的模型状态必须是一致的。