【问题标题】:wxWidgets / wx Form Builder Inheritance Class EventswxWidgets / wx 表单生成器继承类事件
【发布时间】:2021-12-29 20:28:32
【问题描述】:

Windows 11,VS Studio 19 wx 版本 3.1.5

我使用 wx Form Builder 生成代码,然后是继承类(一次),但是每当我单击菜单项(m_Mod)时,它都不会调用派生类函数(应该创建一个带有文本的消息框“CALLED”,但没有出现),据我所知,这就是它的工作方式。

我尝试添加覆盖,将事件设置为 Connect 和 Table,以及 impl_virtual、decl 和 pure virtual,经过一个小时的搜索,没有任何重大帮助。

(如果我将代码放在它确实运行的 cMainFrame 函数声明中,而不是在它在 cMain 派生类函数中时)

完整代码在:https://github.com/Miitto/Arma-Mod-Assistant

cGUI.h(wxFormBuilder 生成,去除了一些杂乱)

class cMainFrame : public wxFrame
{
protected:
    wxMenuBar* m_menuBar;
    wxMenu* m_file;
    wxMenu* m_New;

    virtual void newMod( wxCommandEvent &event) {event.Skip();}

    cMainFrame( wxWindow* parent, wxWindowID id = id_mainFrame, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 1920,1080 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
    wxAuiManager m_mgr;
    ~cMainFrame();
};

cGUI.cpp

cMainFrame::cMainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );
    m_mgr.SetManagedWindow(this);
    m_mgr.SetFlags(wxAUI_MGR_DEFAULT);

    m_menuBar = new wxMenuBar( 0 );
    m_file = new wxMenu();
    m_New = new wxMenu();
    wxMenuItem* m_NewItem = new wxMenuItem( m_file, wxID_ANY, wxT("New"), wxEmptyString, wxITEM_NORMAL, m_New );
    wxMenuItem* m_Mod;
    m_Mod = new wxMenuItem( m_New, id_newModMenu, wxString( wxT("Mod") ) , wxEmptyString, wxITEM_NORMAL );
    m_New->Append( m_Mod );
    m_mgr.Update();
    this->Centre( wxBOTH );

    // Connect Events
    m_New->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( cMainFrame::newMod ), this, m_Mod->GetId());
}

cMain.h(wxFormsBuilder生成的继承类)

#ifndef __cMain__
#define __cMain__
#include "cGUI.h"
class cMain : public cMainFrame
{
protected:
        // Handlers for cMainFrame events.
        void newMod( wxCommandEvent& event );
public:
    cMain( wxWindow* parent);

}
#endif

cMain.cpp

#include "cMain.h"
#include <wx/msgdlg.h>

cMain::cMain( wxWindow* parent )
:
cMainFrame( parent )
{

}
void cMain::newMod( wxCommandEvent& event )
{
    wxMessageBox(wxT("CALLED"));
    event.Skip();
}

【问题讨论】:

  • 常用节 - wx 版本?操作系统/工具包?你当然需要一个正确的event sink 参数来传递给 Connect 函数。 (顺便说一句,你为什么使用 Connect() (仍然)?
  • 添加了 vserion 等,我也尝试使用事件表并获得相同的结果 - 是否可以详细说明 event sink 参数
  • 您发布的代码(大部分)对我有用。我说“大部分”是因为我必须将m_menuBar-&gt;Append( m_New, wxT("&amp;ModMenu") );SetMenuBar( m_menuBar ); 添加到您的cGUI.cpp 中。我假设您在消除混乱时将它们排除在外。我知道这些行将由 wxFormBuilder 生成(我从另一个 wxFormbuilder 项目中剪切它们并将它们粘贴到您的代码中)。没有这些行,就没有可单击的菜单。
  • 这与您的问题无关,但也没有理由使用 ID id_mainFrameid_newModMenu。您应该在 wxFormBuilder 中将它们保留为 wxID_ANY
  • 有点奇怪,我不相信我删除了那些行,虽然我可能弄错了 (|) 我给他们的 ID 只是为了检查这是否可行,它们最初是 wxID_ANY

标签: inheritance wxwidgets wxformbuilder


【解决方案1】:

如果您实际上将菜单项附加到菜单栏,则此代码肯定可以工作,因此您可以单击它(正如@New Pagodi 已经提到的)。正如@macroland 所提到的,你不需要wxCommandEventHandlerBind(),使用它可以隐藏潜在的错误(即使这里不是这种情况)。推荐和更简单的方法是将这一行写成:

m_New->Bind(wxEVT_MENU, &cMainFrame::newMod, this, m_Mod->GetId());

但是,再次显示的代码确实有效,因此您确实需要显示您使用的实际代码,因为您似乎在简化问题的同时以某种方式解决了问题。当然,既然你已经修复了它,你也应该能够很容易地自己找到问题,只需将你在此处发布的版本与你拥有的版本进行比较。

【讨论】:

  • 我已经为整个项目添加了一个 GitHub 链接即使提供了代码编辑,我什至无法让简化版本工作,所以我开始认为这与我的目的有关: /
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多