0

グリッド アプリケーションに検索機能を実装しようとしています。を使用してカーソルを移動できますSetGridCursor(self, row, col)が、グリッドの「ビューポート」を新しいカーソル位置に移動する方法がわかりません。つまり、ユーザーが探しているセルにカーソルが移動した場合でも、ユーザーはカーソル セルが見つかるまで手動でスクロールする必要があります。

グリッド カーソルをビューポートの中央に配置できるように、プログラムでグリッドをスクロールするにはどうすればよいですか?


ランダムに、この質問を書いている間、私は Grid wiki ページに行き、「スクロール」という単語を検索して見つけました:

MakeCellVisible( int row, int col )— 特定のセルを強制的に表示し、効果的にグリッドをスクロールして特定のセルに移動します

これで私の問題はほとんど解決します。セルをビューポートの中央に配置したいのですが、この関数はセルが画面の端に表示されるまでスクロールするだけです。カーソル位置にも影響せずに、グリッドのスクロール位置のみに影響する関数が見つかりません。考え?

4

2 に答える 2

4

このような状況では、wxWidgets(コア C++ ライブラリ) によってどのメソッドが公開されているかを確認してください。wxGridサブクラスwxScrolledwxScrolled次のメソッドを公開します。

  • Scroll

    ビューの開始点が指定されたポイントになるようにウィンドウをスクロールします。

  • GetVirtualSize

    スクロール可能なウィンドウ領域のデバイス単位のサイズを取得します (現在表示されているウィンドウの領域であるクライアント サイズではありません)。

これらの方法を使用して、スクロール可能なウィンドウの中心座標を計算できると思います。ここで必要なのは、中心にしたいセルの座標です。wxGridこのメソッドを公開します:

  • CellToRect

    論理座標でのグリッド セルのサイズと位置に対応する四角形を返します。

ここで、C++ では、wxGridを a にキャストして、wxScrolled必要なメソッドを呼び出します。ただし、 で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 に答える