wxwidgets连接到成员类中的函数

时间:2015-01-16 19:50:38

标签: c++ wxwidgets

部首: 我上课了一个测试功能和一个面板

class testsubclass{
      public:
         testsubclass();
         void testfunc(wxCommandEvent &event);
};

class panelonwindow : public wxPanel{
      public:
         panelonwindow(wxWindow *windowid, int ID);
         wxWindow *mywindow, *mypanel;
         wxTextCtrl *mytextcontrol;

         void maketextctrl(std::string label, int &id);
}

我希望这个类在我的主窗口上创建一个Textcontrol。作为我使用的功能

testsubclass::testsubclass(){
}

panelonwindow::panelonwindow(wxWindow *windowid, int ID)
    :wxPanel(windowid, ID, wxDefaultPosition, wxSize(150, 150)){
        mywindow = windowid;
        mypanel = this;
};

void panelonwindow::maketextctrl(std::string label, int &id){
    wxString newlabel(label.c_str(), wxConvUTF8);
    mytextcontrol = new wxTextCtrl(mypanel, id, newlabel, wxDefaultPosition, wxSize(130, 30));
}


void testsubclass::testfunc(wxCommandEvent &event){
    printf("%s\n", "testfunc was called");
}

我的主窗口头文件包含指向这两个类的指针:

部首:

wxWindow *mainwindow;
testsubclass *mysubclass;
panelonwindow *testpanel;
int ID1 = 100;
int ID2 = 101;

现在主要功能如下:

mainwindow = this;
std::string textcontrolstring = "this is a test";
testpanel = new panelonwindow(mainwindow, ID);
testpanel->maketextctrl(textcontrolstring, ID2);

mysubclass = new testsubclass();

问题是,我无法从主窗口函数将testsublass函数testfunc链接到这样的事件,当我尝试做这样的事情时,我得到一些神秘的编译器消息:

Connect(ID2, wxEVT_COMMAND_TEXT_UPDATED,
    wxCommandEventHandler(mysubclass->testfunc));

我可以将void panelonwindow :: maketextctrl中的一个事件链接到panelonwindow函数的另一个成员(假设我以类似于void panelonwindow :: testfunc(wxCommandEvent& event)的方式声明它们

void panelonwindow::maketextctrl(std::string label, int &id){
    wxString newlabel(label.c_str(), wxConvUTF8);
    mytextcontrol = new wxTextCtrl(mypanel, id, newlabel, wxDefaultPosition, wxSize(130, 30));

Connect(id, wxEVT_COMMAND_TEXT_UPDATED,
    CommandEventHandler(panelonwindow::testfunc))
}

由于我打算在面板上创建很多按钮,我宁愿在成员类中定义函数,而不是为每个按钮/ textcontrolwindow编写一个函数来单独控制所有窗口。

这可能是一个新手问题,但我会感激任何帮助

2 个答案:

答案 0 :(得分:1)

你需要在生成事件的对象上调用Connect()并向其传递处理它的对象(wxWidgets还有什么方法来确定将事件发送到哪个对象?它无法读取你的代码找出)。因此,要处理testsubclass::testfunc()中的evnet,您需要调用

Connect(id, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(testsubclass::testfunc), NULL, mysubclass);

但是你仍然需要决定你想要/需要调用哪个对象{。{1}}。

如果您使用wxWidgets 3(您应该使用),请考虑使用较短的事件类型名称和更现代的Connect(),因为它更清晰,更短:

Bind()

答案 1 :(得分:0)

这很大程度上解决了它。但是,部分

Connect(id, wxEVT_COMMAND_TEXT_UPDATED,  CommandEventHandler(testsubclass::testfunc), NULL, mysubclass);

仍然没有奏效。我用

代替了它
Connect(id, wxEVT_COMMAND_TEXT_UPDATED,
(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &testsubclass::testfunc,
NULL, mysubclass)

修复它。