QTableView 将视图重新聚焦到特定列

Posted

技术标签:

【中文标题】QTableView 将视图重新聚焦到特定列【英文标题】:QTableView re-focus the view to specific column 【发布时间】:2014-06-10 09:19:26 【问题描述】:

我有一个 QTableView,其中显示了 80 多列。我为 QTableView 创建的子类允许具有我想要的标准表格内容的功能,例如按列排序移动列和行隐藏列和行等。

但是我遇到的问题是视图的焦点。假设您拥有表格中的所有数据,您一直向右滚动,因此如果我单击第 80 行的标题(订购到第 80 列)表格重新排序(如预期的那样)但是它也将视图跳转到最后一个焦点单元格(据我所知,这是最后一次单击的单元格)

我想要做的不一定是重新关注被点击的列,因为这可能仍然会改变视图我正在寻找的只是保持视图的焦点完全不变,而不是让它跳回到最后一个点击单元格是?

焦点策略是否缺少一些标志,或者我需要获取当前视图并将视图设置回该视图,然后单击鼠标重新排序表格,如果是这样,如何做到这一点。

我知道我没有为这个问题提供任何代码,但它似乎没有任何需要,因为它不是我想要修复更多我不知道的功能的错误,如果你想看到任何只是评论

编辑:

我使用的是 QSortFilterPorxyModel,这似乎只设置了一次(当我在构造上首次调用它之后调用 this->setSortingEnabled(true); 时,我的表模型再也不会调用排序。我有一个链接到标题点击信号的插槽,我将滚动条设置为scrollTo() 以单击索引,但我认为排序是在此之后发生的,所以它什么都不做,知道排序后会发出什么信号,这样我就可以捕捉它们然后将视图设置回来也许? 谢谢

【问题讨论】:

【参考方案1】:

在进行排序之前,存储滚动条所在位置的当前值

int vPos = yourQTableView->verticalScrollBar()->sliderPosition();
int hPos = yourQTableView->horizontalScrollBar()->sliderPosition();

然后在排序后,将其放回

yourQTableView->verticalScrollBar()->setSliderPosition(vPos);
yourQTableView->horizontalScrollBar()->setSliderPosition(hPos);

您要查找的信号是从 QAbstractItemModel 继承的 QSortFilterProxyModel 的信号:

layoutAboutToBeChanged()
layoutChanged()

【讨论】:

我确定这会完美运行,但我似乎无法得到排序后发生的任何信号(这就是它跳转到最后一个焦点单元格的原因),不知道 QSortFilterPorxyModel 是如何工作的从点击中获得信号,但它似乎在我捕获的任何其他信号之后运行,例如SortIndicatorChangedHeaderClickedSectionClicked 好吧,事实证明我的问题是在布局更改后将列大小调整为内容的功能隐藏并显示表格,所以这是一个问题,为答案欢呼,提供的信息看起来像这样做的方法 很高兴能帮上忙!我多年来一直使用这个网站作为参考,但刚刚开始贡献。实际上,我第一次获得真正的帮助可能比你的问题得到解决更兴奋:D【参考方案2】:

我无法通过创建QTableWidget、用随机内容填充它然后对特定列进行排序来重现您的症状。选定的单元格保持选中状态,但如果它已滚出屏幕,则不会变得可见。

所以问题是,是什么导致了您所看到的行为。听起来好像scrollTo() 正在被其他一些函数调用。由于这是一个虚函数,我会用传递函数覆盖它,看看它何时被调用。

【讨论】:

我没有使用 QTableWidget 我使用 QTableView 并滚动到只是一个函数,我认为我可以在排序后调用以将视图恢复到原来的位置,但就像我说它不起作用并且现在被删除了 @AngryDuck QTableWidget 继承自 QTableView;所以他们应该分享他们的行为。既然他们不这样做,就会发生一些奇怪的事情。而且我仍然认为您应该尝试重载scrollTo 函数,以查看它是否以某种方式被代码的其他部分调用。如果是,您不必传递它。

以上是关于QTableView 将视图重新聚焦到特定列的主要内容,如果未能解决你的问题,请参考以下文章

QTableview:根据其他列中的值显示特定列中的数据

QTableView的自定义排序方法?

一个 QStandardItemModel 用于不同的 QTableView、通用视图和特定视图

QTableView中使用Delegate方式来实现对特定列的文本进行换行

QTableView 固定列宽度(鼠标拖动后,仍可固定)

QTableView自适应填充伸展列宽的基础上 再固定特定某列宽