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