我已经搜索了很长一段时间并且考虑了不同的选择很长一段时间,我现在绝对难倒了。我创建了一个简单的类,它在构造函数中生成16个按钮并为它们分配ID。我希望每个按钮在单击时触发事件。
标题中的类:
class step16
{
///signals and buttons
private:
wxButton* sequencer [16];
long* ids = new long[16];
public:
step16(wxFrame* frame);
~step16();
};
声明源文件中的函数:
///constructor for 16 step sample sequencer class
step16::step16(wxFrame* frame)
{
///clear all signals on initialization and create buttons
for(int i = 0; i < 16; i++){
ids [i] = wxNewId();
sequencer[i] = new wxButton(frame,ids[i],wxString::Format(_("")),
wxPoint(i*30 , 0,wxSize(30,20) );
}
}
///destructor for the 16 step sequencer class
step16::~step16(){delete[]signals;}
我知道如何将单击事件添加到wxWidgets中的按钮的唯一方法是在Main wxFrame的初始化部分中使用Connect()方法,但是在程序的该部分中连接它们将不会带来所需的结果。主要是因为我需要一组新的16个按钮,在step16类的每个实例中都有唯一的ID和事件。我如何为每个按钮添加唯一的点击事件?
答案 0 :(得分:2)
您可以使用Bind绑定从wxEventHandler派生的任何类中的处理程序(即几乎任何标准的wxWidgets类,包括wxFrame)。
将按钮的ID传递给Bind()
调用,以便事件处理程序知道按下了哪个按钮。
例如,您的step16
构造函数可能如下所示:
///constructor for 16 step sample sequencer class
step16::step16(wxFrame* frame)
{
///clear all signals on initialization and create buttons
for(int i = 0; i < 16; i++)
{
ids [i] = wxNewId();
sequencer[i] = new wxButton(frame,ids[i],wxString::Format(_("")),
wxPoint(i*30,0), wxSize(30,20));
/// Add it to something so I can test this works!
frame->GetSizer()->Add(sequencer[i]);
/// Bind the clicked event for this button to a handler
/// in the Main Frame.
sequencer[i]->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
&MainFrame::OnPress,
(MainFrame*)frame);
}
}
在这个例子中,我在MainFrame
类中创建了一个事件处理程序,指向一个实例的指针被传递给step16
的ctor。
您可以使用event.GetId()
来区分按下按钮,这将是该行设置的值:
ids [i] = wxNewId();
MainFrame::OnPress
方法可能如下所示:
void MainFrame::OnPress(wxCommandEvent& event)
{
long firstID = *theStep16->GetIDs();
switch(event.GetId() - firstID)
{
case 0:
std::cout << "First button" << std::endl;
break;
case 1:
std::cout << "Second button" << std::endl;
break;
default:
std::cout << "One of the other buttons with ID "
<< event.GetId() << std::endl;
}
}