2

ユーザーが列を新しいインデックスにドラッグすると、wx.grid.EVT_GRID_COL_MOVEイベントがトリガーされます。ハンドラーは、移動された列の古いインデックスを含むwx.grid.GridEventプロパティを含むを受け取ります。ただし、イベントには、列が移動さColれた場所の詳細を示す属性が含まれていないようです。どうすればそれを理解できますか?

4

1 に答える 1

2

EVT_GRID_COL_MOVEイベントの場合、移動中の列のIDGridEvent.GetCol()を返します。列の実際の位置は で取得できます。ただし、wxWidgets 2.8 と wx 2.9 には違いがあります。Grid.GetColPos(colId)

ではwx 2.8、列が移動された後EVT_GRID_COL_MOVEに送信されます。これにより、イベントを拒否できなくなります。したがって、イベント中に呼び出すと、列の新しい位置が返されます。GetColPos()

ではwx 2.9、列が移動されるEVT_GRID_COL_MOVEにトリガーされ、イベントを拒否すると列が移動されなくなります。イベント中に呼び出すと、列の現在の位置が返されます。GetColPos()

列の新しい位置は、マウスの位置に基づいて内部で計算されます。Python でそのコードを複製すると、将来のリリースと競合し、プログラムが壊れる可能性があります。

を使用wx 2.9+すると、新しい列の位置が得られ、移動を「拒否」(または元に戻す) できる回避策を実装できます。

self.Bind(wx.grid.EVT_GRID_COL_MOVE, self.OnColMove)
def OnColMove(self,evt):
    colId = evt.GetCol()
    colPos = self.grid.GetColPos(colId)
    wx.CallAfter(self.OnColMoved,colId,colPos)
    # allow the move to complete

def OnColMoved(self,colId,oldPos):
    # once the move is done, GetColPos() returns the new position
    newPos = self.grid.GetColPos(colId)
    print colId, 'from', oldPos, 'to', newPos
    undo = False
    if undo: # undo the move (as if the event was veto'd)
        self.grid.SetColPos(colId,oldPos)

SetColPos移動を元に戻す必要がある場合は、 が 2 回呼び出されることに注意してください(内部で 1 回、 で 2 回目OnColMoved)。

または、 を調べることもできますwx.lib.gridmovers

于 2013-01-08T03:00:24.660 に答える