0

我正在尝试在我的网格应用程序中实现查找功能。我可以使用 移动光标SetGridCursor(self, row, col),但我不知道如何将网格的“视口”移动到新的光标位置。换句话说,当光标移动到用户正在寻找的单元格时,用户仍然必须手动滚动直到他找到光标单元格。

如何以编程方式滚动网格,以便可以在视口中居中网格光标?


随机地,在写这个问题时,我去了 Grid wiki 页面,搜索了“scroll”这个词,发现:

MakeCellVisible( int row, int col )- 强制特定单元格可见,有效地滚动网格以给定单元格

这几乎解决了我的问题。我希望单元格在视口中居中,但此功能只会滚动,直到单元格在屏幕边缘可见。我找不到任何只影响网格滚动位置而不影响光标位置的函数。想法?

4

2 回答 2

4

wxWidgets在这种情况下,请查看(核心 C++ 库)公开了哪些方法。wxGrid子类wxScrolledwxScrolled公开这些方法:

  • Scroll

    滚动窗口,使视图开始位于给定点。

  • GetVirtualSize

    获取可滚动窗口区域的设备单位大小(与客户端大小相反,客户端大小是当前可见的窗口区域)。

我认为您可以使用这些方法来计算可滚动窗口的中心坐标。现在,您需要的是要居中的单元格的坐标。wxGrid公开此方法:

  • CellToRect

    返回与网格单元格的大小和逻辑坐标中的位置相对应的矩形。

现在,在 C++ 中,您可以将您的wxGrid转换为 awxScrolled并调用您想要的方法。但是,wxPython并不总是公开 中可用的所有方法wxWidgets,因此在这里您必须使用未绑定的方法获得一些创意。下面是一些伪代码,它未经测试,但应该让您了解如何执行此操作。

grid = wx.Grid()

cell_coords = grid.CellToRect(12,12)

# get the virtual size by calling it as unbound method
virtual_size = wx.Scrolled.GetVirtualSize(grid)

# calculate the upper-left coordinate
scroll_coords = (cell_coords.x - virtual_size.width / 2,
                 cell_coords.y - virtual_size.height / 2)

# call Scroll as unbound method
wx.Scrolled.Scroll(grid, scroll_coords)
于 2013-01-10T21:22:58.333 回答
2

这对我来说适用于垂直滚动以将网格光标保持在页面中间:

def set_grid_cursor(grid, irow, icol):
    # move the cursor to the cell as usual
    grid.GoToCell(irow, icol)
    # scroll to keep irow in the middle of the page
    ppunit = grid.GetScrollPixelsPerUnit()
    cell_coords = grid.CellToRect(irow, icol)
    y = cell_coords.y / ppunit[1]  # convert pixels to scroll units
    scrollPageSize = grid.GetScrollPageSize(wx.VERTICAL)
    scroll_coords = (0, y - scrollPageSize / 2)
    grid.Scroll(scroll_coords)

wx.CallAfter(set_grid_cursor, grid, irow, icol)如果您刚刚更新了网格,您可能必须使用它来调用它。

于 2013-04-09T05:57:21.937 回答