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

Ang*_*uck 2 c++ qt qtableview

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

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

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

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

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

编辑:

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

Luc*_*dic 5

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

int vPos = yourQTableView->verticalScrollBar()->sliderPosition();
int hPos = yourQTableView->horizontalScrollBar()->sliderPosition();
Run Code Online (Sandbox Code Playgroud)

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

yourQTableView->verticalScrollBar()->setSliderPosition(vPos);
yourQTableView->horizontalScrollBar()->setSliderPosition(hPos);
Run Code Online (Sandbox Code Playgroud)

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

layoutAboutToBeChanged()
layoutChanged()
Run Code Online (Sandbox Code Playgroud)