【问题标题】:Scroll QTableWidget to specific column滚动 QTableWidget 到特定列
【发布时间】:2012-03-03 08:57:20
【问题描述】:

我在 QTableWidget 中有一堆数据,我希望能够滚动到特定列。我目前正在使用 scrollToItem(self.item(0, col))。但是,这会将行硬编码为 0。如果用户正在查看第 100 行并滚动到特定列,则会导致问题,因为它失去了在表格中的垂直位置。

有没有办法在 QTableWidget 提供的 QScrollArea 中找到用户当前正在查看的行?如果是这样,我可以轻松地用正确的行替换该默认行。

也许还有另一种方法可以使用 .ensureWidgetVisible() 之类的方法来实现此结果?但是,我不确定如何获得想要滚动到或显示的正确小部件。

【问题讨论】:

  • 我似乎可以通过在调用scrollToItem之前获取垂直滚动条的值然后在调用scrollToItem之后将滚动条值设置回这个来实现它:curr_pos = self.verticalScrollBar().value() self.scrollToItem(self.item(0, col)) self.verticalScrollBar().setValue(curr_pos)

标签: python scroll pyqt qtablewidget


【解决方案1】:

这样做的一种方法是获取第一个可见行的行索引,然后使用它来查找您要滑动到的列中的第一个可见项:

def scrollToColumn(self, column=0):
    visible = self.itemAt(0, 0)
    if visible is not None:
        self.scrollToItem(self.item(visible.row(), column))

由于您滚动到的项目所在的行已经可见,因此视图不应垂直滚动(除非verticalScrollModeScrollPerPixel 并且点(0, 0) 处的项目不完全可见)。

【讨论】:

  • 那么 itemAt(0, 0) 返回当前可见矩形中的单元格?也就是说,当前的左上角,而不是绝对的左上角?
  • 没关系,一个简单的测试验证了我。是的,itemAt(..) 实际上返回左上角的当前项目。因此,itemAt 的坐标是相对于当前可视区域的,而不是整个滚动区域的绝对坐标。
  • 是否有任何理由选择此解决方案而不是捕获当前滚动条值并重置它的解决方案?有没有我没有考虑到的陷阱?
  • @durden2.0。我会说我的解决方案更有效,因为视图只滚动一次。但是,差异可能很小,用户不太可能注意到。
  • 这很好。我成功地测试了这两种解决方案。但是,我确实认为您的解决方案可能更干净一些,因为在我的原始解决方案中可能会导致“生涩”的滚动条行为,它在 scrollToItem 之后滚动然后被强制返回。我在我的代码中没有看到这种行为,但似乎有可能。我更喜欢你的解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多