gpt4 book ai didi

c++ - 从父类 QAbstractItemView 断开插槽

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:11 36 4
gpt4 key购买 nike

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

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

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

编辑/

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

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)));
// (...)
}

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

最佳答案

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

如果你不想让数据消失,那就让它留下而不是躺在 View 上。该 View 可以随时请求模型的数据,并且您对 View 的依赖以某种方式处于静止状态“如果只有”滚动条不移动是不正确的。 View 和模型之间没有保证此类行为的契约。

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

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

关于c++ - 从父类 QAbstractItemView 断开插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41247717/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com