如何获取 wxGrid 中移动列的新索引?
How do I get the new index of a moved column in a wxGrid?
我正在使用 wxWidgets 3.1.0 并且我正在用 C++ 开发 Windows 应用程序。
我正在使用底座 wxGrid and I've enabled column re-ordering via dragging them with the mouse (EnableDragColMove(true))。我现在的问题是,我需要在 列被拖动到新位置后获得移动列的新 position/index 。
不幸的是,我无法从可用的 API 中找到执行此操作的方法。
我已经尝试捕获 wxGridEvent wxEVT_GRID_COL_MOVE then using GetCol() and GetColPos() 来检查列的新索引:
gridDataList->Bind(wxEVT_GRID_COL_MOVE, &FormData::OnList_ColumnMove, this);
...
void FormData::OnList_ColumnMove(wxGridEvent& event)
{
int movedCol = event.GetCol();
int movedColPos = gridDataList->GetColPos(movedCol );
...
}
但事件似乎在 BEFORE 列实际移动之前触发,因此 GetColPos() 仍将 return当前列索引,不是新索引。
列移动后似乎没有要捕获的事件。
我目前的 solutions/workarounds 是:
在捕捉到 wxEVT_GRID_COL_MOVE 事件后手动处理列移动(如 wxWidgets 文档中所建议),以便我可以正确跟踪之前在移动列的索引之后。
在列移动到新位置后手动触发回调或计时器事件,类似于 another SO post 中建议的 wxPython 解决方法。
尽管如此,我想知道是否有更简洁、更简单的方法而不诉诸上述解决方法。
如有任何建议,我们将不胜感激。
是的,这个 wxEVT_GRID_COL_MOVE
是在移动列之前生成的,因为它可以被否决,从而防止移动发生。确实,如果它带有新的列位置会很方便,但不幸的是目前它没有(解决这个问题很简单,欢迎任何 patches doing this!)。
using CallAfter()
的标准变通方法是稍后执行您的代码,但无需更改 wxWidgets 即可正常工作。也就是说,假设你使用 C++11,你应该可以只写
void FormData::OnList_ColumnMove(wxGridEvent& event)
{
const int movedCol = event.GetCol();
CallAfter([movedCol]() {
int movedColPos = gridDataList->GetColPos(movedCol);
...
});
}
我正在使用 wxWidgets 3.1.0 并且我正在用 C++ 开发 Windows 应用程序。
我正在使用底座 wxGrid and I've enabled column re-ordering via dragging them with the mouse (EnableDragColMove(true))。我现在的问题是,我需要在 列被拖动到新位置后获得移动列的新 position/index 。
不幸的是,我无法从可用的 API 中找到执行此操作的方法。
我已经尝试捕获 wxGridEvent wxEVT_GRID_COL_MOVE then using GetCol() and GetColPos() 来检查列的新索引:
gridDataList->Bind(wxEVT_GRID_COL_MOVE, &FormData::OnList_ColumnMove, this);
...
void FormData::OnList_ColumnMove(wxGridEvent& event)
{
int movedCol = event.GetCol();
int movedColPos = gridDataList->GetColPos(movedCol );
...
}
但事件似乎在 BEFORE 列实际移动之前触发,因此 GetColPos() 仍将 return当前列索引,不是新索引。
列移动后似乎没有要捕获的事件。
我目前的 solutions/workarounds 是:
在捕捉到 wxEVT_GRID_COL_MOVE 事件后手动处理列移动(如 wxWidgets 文档中所建议),以便我可以正确跟踪之前在移动列的索引之后。
在列移动到新位置后手动触发回调或计时器事件,类似于 another SO post 中建议的 wxPython 解决方法。
尽管如此,我想知道是否有更简洁、更简单的方法而不诉诸上述解决方法。
如有任何建议,我们将不胜感激。
是的,这个 wxEVT_GRID_COL_MOVE
是在移动列之前生成的,因为它可以被否决,从而防止移动发生。确实,如果它带有新的列位置会很方便,但不幸的是目前它没有(解决这个问题很简单,欢迎任何 patches doing this!)。
using CallAfter()
的标准变通方法是稍后执行您的代码,但无需更改 wxWidgets 即可正常工作。也就是说,假设你使用 C++11,你应该可以只写
void FormData::OnList_ColumnMove(wxGridEvent& event)
{
const int movedCol = event.GetCol();
CallAfter([movedCol]() {
int movedColPos = gridDataList->GetColPos(movedCol);
...
});
}