2

当用户将列拖动到新索引时,将wx.grid.EVT_GRID_COL_MOVE触发该事件。处理程序接收一个wx.grid.GridEvent包含属性的属性,该属性Col包含移动列的旧索引。该事件似乎不包含任何详细说明该列已移动何处的属性。我怎么知道呢?

4

1 回答 1

2

如果EVT_GRID_COL_MOVE发生事件,GridEvent.GetCol()则返回正在移动的列的ID 。柱子的实际位置可以用 得到Grid.GetColPos(colId)。但是,wxWidgets 2.8 和 wx 2.9 之间是有区别的:

In 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如果必须撤消移动,将调用两次(一次在内部,第二次在 中OnColMoved)。

或者,您可以查看wx.lib.gridmovers.

于 2013-01-08T03:00:24.660 回答