我正在使用 wxWidgets 3.1.0 并且正在使用 C++ 开发 Windows 应用程序。
我正在使用基础 wxGrid并且我通过使用鼠标 ( EnableDragColMove(true) ) 拖动来启用列重新排序。我现在的问题是,我需要在列被拖动到新位置后 获取移动列的新位置/索引。
不幸的是,我无法从可用的 API 中找到执行此操作的方法。
我试过捕捉 wxGridEvent wxEVT_GRID_COL_MOVE 然后使用 GetCol()和 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()仍将返回当前列索引,NOT 新索引。
列移动后似乎没有要捕获的事件。
我目前的解决方案/解决方法是:
在捕捉到 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);
...
});
}
关于c++ - 如何获取 wxGrid 中移动列的新索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42196986/