c++ - wxWidgets: 类 wxDialog * 不能转换为类 wxApp *
问题描述
问题正是标题中的内容,我的 wxWidgets 应用程序正在崩溃,因为从对话框类到应用程序类的转换不起作用。有什么帮助吗?
错误信息:
错误 C2440:“正在初始化”:无法从“MP *”转换为“MPApp *”
错误 C2664:“void wxAppBase::SetTopWindow(wxWindow *)”:无法将参数 1 从“MPApp *”转换为“wxWindow *”
错误 C2039:“显示”:不是“MPApp”的成员
MPApp.cpp:
#include "MPApp.h"
#include "MP.h"
IMPLEMENT_APP(MPApp)
bool MPApp::OnInit()
{
MPApp* dialog = new MP((NULL));
SetTopWindow(dialog);
dialog->Show(true);
return true;
}
int MPApp::OnExit()
{
return 0;
}
MPApp.h:
#ifndef __MPApp_h__
#define __MPApp_h__
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#else
#include <wx/wxprec.h>
#endif
class MPApp : public wxApp
{
public:
bool OnInit();
int OnExit();
};
#endif
MP.h:
#ifndef __MP_h__
#define __MP_h__
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dialog.h>
#else
#include <wx/wxprec.h>
#endif
#include <list>
#include <wx/menu.h>
#include <wx/timer.h>
#include <wx/listctrl.h>
#include <wx/textctrl.h>
#include <wx/stattext.h>
#include <wx/checkbox.h>
#include <wx/mediactrl.h>
#include <wx/slider.h>
#include <wx/button.h>
#include <wx/bmpbuttn.h>
#include <wx/panel.h>
#include <wx/sizer.h>
#include <wx/toplevel.h>
#undef MPSTYLE
#define MPSTYLE wxWANTS_CHARS | wxALWAYS_SHOW_SB | wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxCLOSE_BOX
class MP : public wxDialog
{
private:
DECLARE_EVENT_TABLE();
public:
//Constuctor
MP(wxWindow* parent, wxWindowID id = 0, const wxString& title = wxT("Music"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = MPSTYLE);
virtual ~MP();
//Player
void PlayFileNow();
// EVENTS
// Command Events
void AddToQueue(wxCommandEvent& event);
void WxButton1Click(wxCommandEvent& event);
void PlayButtonClick(wxCommandEvent& event);
void NextButtonClick(wxCommandEvent& event);
void PreviousButtonClick(wxCommandEvent& event);
void StopButtonClick(wxCommandEvent& event);
void RandomCheckboxClick(wxCommandEvent& event);
void WxButton2Click(wxCommandEvent& event);
void SavePlaylistClick(wxCommandEvent& event);
void LoadPlaylistClick(wxCommandEvent& event);
void AddButtonClick(wxCommandEvent& event);
void PlaylistsButtonClick(wxCommandEvent& event);
void FindButtonClick(wxCommandEvent& event);
void FindTextEditEnter(wxCommandEvent& event);
void FindNextButtonClick(wxCommandEvent& event);
void FindPrevButtonClick(wxCommandEvent& event);
//Media Events
void WxMediaCtrl1MediaFinished(wxMediaEvent& event);
void WxMediaCtrl1MediaPause(wxMediaEvent& event);
void WxMediaCtrl1MediaPlay(wxMediaEvent& event);
void WxMediaCtrl1MediaStop(wxMediaEvent& event);
void WxMediaCtrl1MediaLoaded(wxMediaEvent& event);
//Key Events
void HotKeyNext(wxKeyEvent& event);
void HotKeyStop(wxKeyEvent& event);
void HotKeyPlay(wxKeyEvent& event);
void HotKeyPrev(wxKeyEvent& event);
//List Events
void WxListCtrl1ColLeftClick(wxListEvent& event);
void WxListCtrl1ColRightClick(wxListEvent& event);
void WxListCtrl1RightClick(wxListEvent& event);
void WxListCtrl1ItemActivated(wxListEvent& event);
void WxListCtrl1KeyDown(wxListEvent& event);
//UI Event
void SavePlaylistUpdateUI0(wxUpdateUIEvent& event);
//Scroll Events
void WxSlider2Scroll(wxScrollEvent& event);
void WxSlider1Scroll(wxScrollEvent& event);
//Timer Event
void WxTimer1Timer(wxTimerEvent& event);
//File Event
void MPDropFiles(wxDropFilesEvent& event);
//Mouse Event
void MPRightUP(wxMouseEvent& event);
private:
//GUI Control
//Menu items
wxMenu* PlaylistMenu;
wxMenu* WxPopupMenu1;
wxMenu* AddMenu;
//Timer item
wxTimer* WxTimer1;
//List item
wxListCtrl* WxListCtrl1;
//Button items
wxButton* FindPrevButton;
wxButton* FindNextButton;
wxButton* AddButton;
wxButton* PlaylistsButton;
wxButton* FindButton;
//Bitmaps
wxBitmapButton* PlayButton;
wxBitmapButton* PreviousButton;
wxBitmapButton* NextButton;
//Text items
wxTextCtrl* FindTextEdit;
wxStaticText* WxStaticText1;
//Slider items
wxSlider* WxSlider2;
wxSlider* WxSlider1;
//Panel items
wxPanel* SearchPanel;
wxPanel* WxPanel1;
wxPanel* WxPanel;
//Check item
wxCheckBox* RandomCheckbox;
//Media item
wxMediaCtrl* WxMediaCtrl1;
//Sizer items
wxFlexGridSizer* WxFlexGridSizer1;
wxBoxSizer* WxBoxSizer1;
private:
//Enum IDs for GUI
enum
{
////GUI Enum Control ID Start
ID_MNU_LOADPLAYLIST_1028 = 1028,
ID_MNU_SAVEPLAYLIST_1029 = 1029,
ID_MNU_PLAY_PAUSE_1019 = 1019,
ID_MNU_STOP_1020 = 1020,
ID_MNU_NEXT_1021 = 1021,
ID_MNU_PREVIOUS_1022 = 1022,
ID_MNU_ADDFOLDER_1023 = 1023,
ID_MNU_SAVEPLAYLIST_1024 = 1024,
ID_MNU_LOADPLAYLIST_1025 = 1025,
ID_MNU_ADDFILES_1026 = 1026,
ID_MNU_ADDFOLDER_1027 = 1027,
ID_WXTIMER1 = 1017,
ID_WXLISTCTRL1 = 1015,
ID_FINDPREVBUTTON = 1034,
ID_FINDNEXTBUTTON = 1033,
ID_FINDEDITTXT = 1044,
ID_WXSTATICTEXT1 = 1032,
ID_SEARCHPANEL = 1031,
ID_FINDBUTTON = 1030,
ID_RANDOMCHECKBOX = 1018,
ID_WXMEDIACTRL1 = 1016,
ID_WXSLIDER2 = 1014,
ID_WXSLIDER1 = 1013,
ID_ADDBUTTON = 1008,
ID_PLAYLISTS = 1007,
ID_NEXTBUTTON = 1006,
ID_STOPBUTTON = 1005,
ID_PLAYBUTTON = 1004,
ID_PREVIOUSBUTTON = 1003,
ID_WXPANEL2 = 1002,
ID_WXPANEL1 = 1011,
////GUI Enum Control ID End
ID_HOT_PLAY,
ID_HOT_STOP,
ID_HOT_NEXT,
ID_HOT_PREV,
ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
};
private:
void OnClose(wxCloseEvent& event);
void CreateGUIControls();
protected:
// No description
void AddFilesFromFolder(wxString FileName);
//FileList Dirs, Files;
//wxTreeItemId root;
bool isPlaying;
long selItem;
// No description
void PlayThisFile(long id);
// No description
void PlayFromQueue();
std::list<wxString> lastPlayed, nextPlay;
// No description
void PlayNextFile();
void DeselectAllFiles();
};
#endif
由于文件的长度,我无法包含 MP.cpp,但它编译得很好,而且我已经调试了这些问题。
解决方案
为什么你会期待这条线:
MPApp* dialog = new MP((NULL));
去工作?你MP
是一个wxDialog
,即一种顶级窗口。它根本不是一回事MPApp
,它是一种应用程序对象。
也许这只是一个错字,你真的想写
MP* dialog = new MP((NULL));
但如果不是,你真的应该问问自己你想在这里实现什么。
此外,切线地,像您在此处那样使用非模态对话框是非常不寻常的(模态对话框将显示为ShowModal()
,而不仅仅是Show()
,并在堆栈而不是堆上创建)。wxFrame
对于普通的非模态窗口来说,几乎总是一个更好的选择。
推荐阅读
- python - ZipFile.extract 将文件夹提取到目录而不是包含的文件
- javafx - JavaFX - 通过 CSS 悬停选择器更改 MenuItem 图标
- mongoose - 无法在 express 应用程序中使用 .skip().limit() mongoose 方法正确分页
- python - 在 Python 中索引 HDF5 数据集时出现“无法从 NULL 指针创建 cython.array”错误
- amazon-web-services - 在 AWS Amplify 中更改我的 GraphQL 架构时如何防止丢失生产数据?
- google-bigquery - 从嵌套对象数组中选择行并删除具有某些匹配列的行
- java - Homebrew 在 Macbook pro m1 上找不到 openjdk
- javascript - .push() 在 throw 下不起作用,使用 async await 方法在 javascript 中循环获取数据
- python - 是否有任何 OpenCV 或 Tensorflow 方法可以将两个非常模糊的图像分类为“白色”或“黑色”?
- c++ - 启用 c++20 编译时 clang-tidy 发出警告