从父类QABSTRACTITEMVIEW中断开插槽

Disconnect slot from parent class QAbstractItemView

本文关键字:断开 插槽 中断 QABSTRACTITEMVIEW 父类      更新时间:2023-10-16

我的 SuperTable类从 QTableView继承,后者又从 QAbstractItemView继承。

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

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

编辑/

我正在尝试实现的目标:不再可用表模型的数据,但是我想将对话框与qtableView及其已包含的数据保持在一起。但是我不能称呼它的data()方法,因为我没有任何东西要返回。在大多数情况下,我已经完成了这一点,除了一个很大的例外:每当用鼠标在单元格上滚动表时,都会发生以下情况:

myApp :: supertable :: data(qmodelindex const& int)const
QSortFilterProxymodel :: Data(Qmodelindex const& int)const
qabtractItemViewPrivate :: checkmousemove(qpersistentModelIndex const&) qabtractItemview :: 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)));
    // (...)
}

由于它位于事物的私人方面,因此不确定这是否可能。有办法吗?

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

如果您不希望数据消失,则将其留下来而不是躺在视图上。该视图可以在任何时候请求模型的数据,并且您对视图的依赖性某种程度上是静止的,如果只有" scrollbars not Move"是不正确的。观点和模型之间没有合同可以保证这种行为。

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

还要注意,如果您已经实现了自己的模型,该模型并不表示为空,但是以某种方式返回了data(或崩溃!)的不同值而又不会发出相关信号 - 您已经损坏了无法修复的内容。该模型的状态,对于任何外部观察者来说都是一致的。