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

时间:2014-06-10 09:19:27

标签: c++ qt qtableview

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

然而我遇到的问题是视图的焦点。假设您拥有表格中的所有数据,您一直向右滚动,这样您就可以看到第70-80列(假设屏幕上一列有10列),如果我点击第80行的标题(订购)通过列80)表重新排序(如预期的那样)但是它也会将视图跳转到最后一个聚焦单元格(据我所知,它是最后一次单击的单元格)

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

焦点策略是否缺少某些标记,或者我需要获取当前视图并在鼠标点击重新排序表后将视图设置回该视图,如果是,那么如何才能完成。

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

编辑:

我使用的是QSortFilterPorxyModel,这似乎设置了一次(当我在构造的初始调用后调用this->setSortingEnabled(true);时,我的表模型再也没有调用sort。我有一个链接到标题点击信号的插槽,并且我将滚动条设置为scrollTo()到点击的索引,但我认为排序发生在此之后所以它什么都不做,任何想法在排序后发出什么信号所以我可以捕获它们然后设置视图回来也许? 感谢

2 个答案:

答案 0 :(得分:5)

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

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

然后在排序后,将其设置回来

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

您正在寻找的信号是从QAbstractItemModel继承的QSortFilterProxyModel的信号:

layoutAboutToBeChanged()
layoutChanged()

答案 1 :(得分:-1)

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

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