wxWidgets中wxButton构造函数参数不匹配,无法创建实例问题
我是wxWidgets新手,尝试使用this指针传入父窗口来创建wxButton控件,相关代码如下:
框架头文件myframe.h代码
#pragma once #include <wx/wx.h> class MyFrame:public wxFrame { public : MyFrame(const wxString& title); ~MyFrame(); public: wxGauge* gh = nullptr; };
框架类实现文件myframe.cpp代码
#include "MyFrame.h" #include <wx/wx.h> MyFrame::MyFrame(const wxString& title) :wxFrame(nullptr, wxID_ANY, title, wxPoint(30, 30), wxSize(600, 600)) { wxButton* bt = new wxButton(this); }
app.h代码
#pragma once #include <wx/wx.h> class App :public wxApp { bool OnInit(); };
app.cpp代码
#include <wx/wx.h> #include "App.h" #include "MyFrame.h" wxIMPLEMENT_APP(App); bool App::OnInit() { MyFrame* frame = new MyFrame("GUi"); frame->Show(); frame->Center(); return true; }
运行前VS在wxButton* bt = new wxButton(this);的左括号下显示红色波浪线,忽略提示编译后出现如下错误:
1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\MyFrame.cpp(9,29): error C2665: 'wxButton::wxButton': no overloaded function could convert all the argument types 1>C:\WxWidgets\include\wx\msw\button.h(82,5): message : could be 'wxButton::wxButton(const wxButton &)' 1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\MyFrame.cpp(9,29): message : 'wxButton::wxButton(const wxButton &)': cannot convert argument 1 from 'MyFrame *' to 'const wxButton &' 1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\MyFrame.cpp(9,30): message : Reason: cannot convert from 'MyFrame *' to 'const wxButton' 1>D:\Projects\visualStudio\cppStuff\wxWidget\learnWxWidget\learnWxWidget\MyFrame.cpp(9,29): message : while trying to match the argument list '(MyFrame *)' 1>Done building project "learnWxWidget.vcxproj" -- FAILED.
错误原因
wxButton没有仅接收父窗口指针的构造函数重载。编译器找不到匹配的构造函数,只能尝试匹配拷贝构造函数wxButton(const wxButton &),但MyFrame*类型无法转换成const wxButton&,因此触发编译错误。
wxButton的基础构造函数至少需要两个参数:父窗口指针和控件ID(文本参数可缺省),或者三个参数(父窗口、ID、按钮文本)。
解决方法
给wxButton构造函数补充必要的参数,比如指定控件ID(可以用wxID_ANY让wxWidgets自动分配)和按钮文本:
修改后的myframe.cpp代码:
#include "MyFrame.h" #include <wx/wx.h> MyFrame::MyFrame(const wxString& title) :wxFrame(nullptr, wxID_ANY, title, wxPoint(30, 30), wxSize(600, 600)) { // 传入父窗口、自动分配的ID、按钮文本 wxButton* bt = new wxButton(this, wxID_ANY, "点击按钮"); }
如果不需要自定义按钮文本,也可以只传父窗口和ID:
wxButton* bt = new wxButton(this, wxID_ANY);
内容的提问来源于stack exchange,提问作者Ammishaddai Boakye
相关产品推荐
相关产品推荐

