从父类QAbstractItemView

时间:2016-12-20 17:08:46

标签: c++ qt user-interface qt4

我的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>

由于它涉及私人方面,因此不确定这是否可行。 有办法吗?

1 个答案:

答案 0 :(得分:1)

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

如果您不希望数据消失,请将其保留而不是躺在视图中。该视图可以随时请求模型的数据 ,并且您对视图的依赖性以某种方式静止“如果仅”滚动条不移动是不正确的。视图和模型之间没有保证这种行为的契约。

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

另请注意,如果您已经实现了自己的模型,该模型并未表示为空,但不知何故从data返回不同的值(或崩溃!)而没有发出相关信号 - 您已经超越了修理。任何外部观察者都可以看到模型的状态必须一致。