我正在尝试对wxGrid进行排序。现在,the documentation告诉我它不支持排序,但它确实生成了一个事件。该文档告诉我该事件被称为wxEVT_GRID_COL_SORT
。足够公平!
现在,问题是我根本不知道如何使事件发挥作用。我的框架有一个事件表,看起来像这样:
BEGIN_EVENT_TABLE(MainWindow, wxFrame)
EVT_BUTTON(XRCID("toevoegknop"), MainWindow::openAddWindow)
// A few other events that work
END_EVENT_TABLE()
那里列出的事件已经完美无缺。在我的MainWindow类中,我声明了一个函数:
void sortColumn(wxGridEvent& event);
现在,我想添加所说的wxEVT_GRID_COL_SORT
事件。从我的角度来看,文档并不是我应该做的事情,所以我只是尝试通过在事件表中添加以下行来添加事件。
wxEVT_GRID_COL_SORT(MainWindow::sortColumn)
出现语法错误,因此不正确。我注意到其他事件刚刚开始使用EVT,所以我试图删除wx,但我还是运气不好。
远程搜索互联网带我到pastebin post处理事件,方法是将以下行添加到框架的构造函数中(在我的案例中为MainWindow)
Grid->Connect(wxEVT_GRID_COL_SORT,(wxObjectEventFunction)&Frame::OnGridColSort);
我这样改编(几乎是MainWindow的整个构造函数)
MainWindow::MainWindow(const wxString& title, const wxPoint& pos, const wxSize& size, Collection* library, MovieDB* database)
: wxFrame(), library_(library), database_(database) {
wxXmlResource::Get()->LoadFrame(this, NULL, _T("hoofdvenster"));
SetSize(size);
grid_ = (wxGrid *)FindWindowById(XRCID("filmtabel"));
// Irrelevant code removed, setting up the grid labels etc.
grid_->Connect(wxEVT_GRID_COL_SORT,(wxObjectEventFunction)&MainWindow::sortColumn);
}
会引发错误:
'wxEVT_GRID_COL_SORT'未在此范围内声明
所以现在我不知道还能尝试什么。请记住,我几天前才开始搞乱wxWidgets,所以对任何wxWidgets用户来说都是微不足道的事情可能不适合我。
提前致谢!
答案 0 :(得分:3)
您使用的wx 2.8.12
似乎没有实现wxEVT_GRID_COL_SORT
。它已添加到wx 2.9
中,因此您必须获取最新的开发版本(2.9.4
)才能使用它。
但是,在wx 2.8
中,您可以处理wxEVT_GRID_LABEL_LEFT_CLICK
并相应地调度事件以模拟事件。
将事件添加到事件地图
EVT_GRID_CMD_LABEL_LEFT_CLICK(ID_GRID,Frame::OnGridLabelLeftClick)
或在构造函数中连接它:
grid->Connect(wxEVT_GRID_LABEL_LEFT_CLICK,
(wxObjectEventFunction)&Frame::OnGridLabelLeftClick);
void Frame::OnGridColSort(wxGridEvent& event) {}
void Frame::OnGridRowSort(wxGridEvent& event) {}
void Frame::OnGridLabelLeftClick(wxGridEvent& event) {
// GetCol and GetRow will return the index of the col/row label clicked
event.Skip(); // the next handler will select col/row/everything, based
// on the label clicked; remove to prevent selection
if( event.GetCol() >= 0 )
OnGridColSort(event);
else if( event.GetRow() >= 0 )
OnGridRowSort(event);
else
; // if both are -1, the upper left corner was clicked (select all)
}
这与EVT_GRID_COL_SORT
的行为类似。