我的SuperTable
类继承自QTableView
,而QAbstractItemView
继承自QTableView
。
在某些时候,QScrollBar
' QAbstractItemView::verticalScrollbarValueChanged(int)
会发出触发QAbstractItemView
广告位的信号。
对于我的应用程序,重要的是这没有发生,所以我想在SuperTable
中断开该插槽,但我还没有找到从data()
获取访问权限的方法。
编辑/
我想要实现的目标:表格模型的数据不再可用,但我希望保持与QTableView及其已包含的数据的对话,可用。但是我无法调用void QAbstractItemViewPrivate::init()
{
// (...)
QObject::connect(vbar, SIGNAL(valueChanged(int)),
q, SLOT(verticalScrollbarValueChanged(int)));
// (...)
}
方法,因为我没有任何东西可以返回。
在大多数情况下,我已经完成了这项工作,但有一个很大的例外:只要用鼠标滚动表格,就会发生以下情况:
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实施中,这是我想要断开的连接:
<xsl:template match="App">
<App>
<xsl:for-each select="//person">
<xsl:variable name ="person" select="." />
<person>
<xsl:for-each select="answerSet[key='JobInfo'][answers/entry[key = 'Applying']/value = 'Y']">
<xsl:variable name ="pos" select="position()" />
<answerSet>
<xsl:copy-of select="$person/answerSet[key='EmpInfo'][$pos]/answers" />
<xsl:copy-of select="answers[not(entry[key = 'Applying']/value = 'Y')]" />
<key>EmpJobInfo</key>
</answerSet>
</xsl:for-each>
</person>
</xsl:for-each>
</App>
</xsl:template>
由于它涉及私人方面,因此不确定这是否可行。 有办法吗?
答案 0 :(得分:1)
如果模型的数据消失了,那么它就消失了,视图的工作就是通知用户这个事实。
如果您不希望数据消失,请将其保留而不是躺在视图中。该视图可以随时请求模型的数据 ,并且您对视图的依赖性以某种方式静止“如果仅”滚动条不移动是不正确的。视图和模型之间没有保证这种行为的契约。
正确的方法是在模型和视图之间插入缓存代理视图模型。当源模型指示它不再有数据时(它可能表示重置或指示所有行都被删除),代理会将其自己的数据限制为某个最近缓存的连续行组,可能查询有关可见的视图行。当然,每个视图都需要一个代理。
另请注意,如果您已经实现了自己的模型,该模型并未表示为空,但不知何故从data
返回不同的值(或崩溃!)而没有发出相关信号 - 您已经超越了修理。任何外部观察者都可以看到模型的状态必须一致。