从父类QABSTRACTITEMVIEW中断开插槽
Disconnect slot from parent class QAbstractItemView
我的 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
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
(或崩溃!)的不同值而又不会发出相关信号 - 您已经损坏了无法修复的内容。该模型的状态,对于任何外部观察者来说都是一致的。
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt插槽调用了两次
- 从父类QABSTRACTITEMVIEW中断开插槽
- 升压信号2 - 通过插槽断开连接时出错
- 在插槽断开连接时清除ExtraSelections Qt