wxWidgets UI应用程序在C++; 在C++ GUI应用程序中添加4个或更多WXBOXSIZER(或任何其他类型的siisher对象),我遇到了麻烦。这是我第一次使用wxWidgets创建GUI应用程序,我使用Code::Blocks作为IDE。如果以前有人遇到过这个问题并解决了它,请帮助我

wxWidgets UI应用程序在C++; 在C++ GUI应用程序中添加4个或更多WXBOXSIZER(或任何其他类型的siisher对象),我遇到了麻烦。这是我第一次使用wxWidgets创建GUI应用程序,我使用Code::Blocks作为IDE。如果以前有人遇到过这个问题并解决了它,请帮助我,c++,user-interface,wxwidgets,codeblocks,C++,User Interface,Wxwidgets,Codeblocks,下面是完整的程序 主框架类实现: /*************************************************************** * Name: testWXWProjectMain.h * Purpose: Defines Application Frame * Author: test () * Created: 2014-01-22 * Copyright: test () * License: ***********

下面是完整的程序

主框架类实现:

/***************************************************************
 * Name:      testWXWProjectMain.h
 * Purpose:   Defines Application Frame
 * Author:    test ()
 * Created:   2014-01-22
 * Copyright: test ()
 * License:
 **************************************************************/

#ifndef TESTWXWPROJECTMAIN_H
#define TESTWXWPROJECTMAIN_H

//(*Headers(testWXWProjectFrame)
#include <wx/sizer.h>
#include <wx/button.h>
#include <wx/menu.h>
#include <wx/panel.h>
#include <wx/statusbr.h>
#include <wx/frame.h>
//*)

class testWXWProjectFrame: public wxFrame
{
    public:

        testWXWProjectFrame(wxWindow* parent,wxWindowID id = -1);
        virtual ~testWXWProjectFrame();

    private:

        //(*Handlers(testWXWProjectFrame)
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        //*)

        //(*Identifiers(testWXWProjectFrame)
        static const long ID_BUTTON1;
        static const long ID_BUTTON2;
        static const long ID_PANEL2;
        static const long ID_PANEL1;
        static const long ID_MENUITEM1;
        static const long idMenuAbout;
        static const long ID_STATUSBAR1;
        //*)

        //(*Declarations(testWXWProjectFrame)
        wxPanel* Panel1;
        wxStatusBar* StatusBar1;
        wxButton* Button1;
        wxButton* Button2;
        wxPanel* Panel2;
        //*)

        DECLARE_EVENT_TABLE()
};

#endif // TESTWXWPROJECTMAIN_H


####################################################
/***************************************************************
 * Name:      testWXWProjectMain.cpp
 * Purpose:   Code for Application Frame
 * Author:    test ()
 * Created:   2014-01-22
 * Copyright: test ()
 * License:
 **************************************************************/

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

//(*InternalHeaders(testWXWProjectFrame)
#include <wx/string.h>
#include <wx/intl.h>
//*)

//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}

//(*IdInit(testWXWProjectFrame)
const long testWXWProjectFrame::ID_BUTTON1 = wxNewId();
const long testWXWProjectFrame::ID_BUTTON2 = wxNewId();
const long testWXWProjectFrame::ID_PANEL2 = wxNewId();
const long testWXWProjectFrame::ID_PANEL1 = wxNewId();
const long testWXWProjectFrame::ID_MENUITEM1 = wxNewId();
const long testWXWProjectFrame::idMenuAbout = wxNewId();
const long testWXWProjectFrame::ID_STATUSBAR1 = wxNewId();
//*)

BEGIN_EVENT_TABLE(testWXWProjectFrame,wxFrame)
    //(*EventTable(testWXWProjectFrame)
    //*)
END_EVENT_TABLE()

testWXWProjectFrame::testWXWProjectFrame(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(testWXWProjectFrame)
    wxMenuItem* MenuItem2;
    wxMenuItem* MenuItem1;
    wxBoxSizer* BoxSizer3;
    wxMenu* Menu1;
    wxBoxSizer* BoxSizer2;
    wxBoxSizer* BoxSizer4;
    wxBoxSizer* BoxSizer1;
    wxMenuBar* MenuBar1;
    wxMenu* Menu2;

    Create(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
    BoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
    BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
    Panel2 = new wxPanel(this, ID_PANEL2, wxDefaultPosition, wxSize(236,171), wxTAB_TRAVERSAL, _T("ID_PANEL2"));
    BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
    Button1 = new wxButton(Panel2, ID_BUTTON1, _("button 1"), wxDefaultPosition, wxSize(121,27), 0, wxDefaultValidator, _T("ID_BUTTON1"));
    BoxSizer4->Add(Button1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    Button2 = new wxButton(Panel2, ID_BUTTON2, _("button2"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
    BoxSizer4->Add(Button2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    Panel2->SetSizer(BoxSizer4);
    SetSizer(BoxSizer4);
    Layout();
    BoxSizer2->Add(Panel2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer1->Add(BoxSizer2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
    Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxSize(262,206), wxTAB_TRAVERSAL, _T("ID_PANEL1"));
    BoxSizer3->Add(Panel1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer1->Add(BoxSizer3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    SetSizer(BoxSizer1);
    MenuBar1 = new wxMenuBar();
    Menu1 = new wxMenu();
    MenuItem1 = new wxMenuItem(Menu1, ID_MENUITEM1, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL);
    Menu1->Append(MenuItem1);
    MenuBar1->Append(Menu1, _("&File"));
    Menu2 = new wxMenu();
    MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL);
    Menu2->Append(MenuItem2);
    MenuBar1->Append(Menu2, _("Help"));
    SetMenuBar(MenuBar1);
    StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1"));
    int __wxStatusBarWidths_1[1] = { -1 };
    int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
    StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1);
    StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1);
    SetStatusBar(StatusBar1);
    BoxSizer1->Fit(this);
    BoxSizer1->SetSizeHints(this);

    Connect(ID_MENUITEM1,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&testWXWProjectFrame::OnQuit);
    Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&testWXWProjectFrame::OnAbout);
    //*)
}

testWXWProjectFrame::~testWXWProjectFrame()
{
    //(*Destroy(testWXWProjectFrame)
    //*)
}

void testWXWProjectFrame::OnQuit(wxCommandEvent& event)
{
    Close();
}

void testWXWProjectFrame::OnAbout(wxCommandEvent& event)
{
    wxString msg = wxbuildinfo(long_f);
    wxMessageBox(msg, _("Welcome to..."));
}
我也尝试了不同的尺寸,但总是给分割错误。如果我使用3个尺码,那么它没有任何问题。
谢谢。

您不能将大小设置为多个wxWindows。例如,在
testWXWProjectFrame::testWXWProjectFrame

Panel2->SetSizer(BoxSizer4);
SetSizer(BoxSizer4);
这将为Panel2(作为框架的子级创建)和框架本身设置相同的大小。通常,您需要为每个容器创建一个框大小调整器(
wxPanel
wxFrame
),并使用
wxWindow::SetSizer
将该大小调整器与容器关联。此外,如果为特定容器(例如
Panel2
)创建了一个尺寸标注器,则只能将
Panel2
的子项添加到该尺寸标注器中(或只包含
Panel2
的子项的尺寸标注器)

在您的代码中,这些关系都是混淆的。另外,为什么您首先将
BoxSizer4
设置为帧的大小调整器,然后在方法末尾将其替换为
BoxSizer1

我还建议您为变量使用有意义的名称。如果源代码包含
BoxSizer1
Panel2
这样的名称,则很难读取源代码。此外,我有时发现,将控件/大小调整器层次结构写成这样的树很有帮助:

  • 框架(BoxSizer4)
    • 面板2(盒尺寸4)
      • 按钮1
      • 按钮2
    • 面板1(盒子尺寸3)

这样可以更容易地检查您是否将正确的控件添加到正确的大小写器,并将大小写器正确设置到容器中。在这里,您可以快速发现
BoxSizer4
设置为两个控件,其中一个控件是另一个的子控件-这将导致崩溃,就像您看到的那样。

在调试模式下编译,然后运行pr使用调试器对程序进行调试。逐步检查代码直到崩溃。这是哪一行?Hi-LumpN,我通过代码进行了调试。编译器可以加载所有对象,但调用Frame->Show()后会出现分段错误;testWXWProjectApp.cpp文件中的方法。这是因为内存泄漏吗?
At…/testWXWProject/testWXWProjectApp.cpp:27程序接收到信号SIGSEGV,分段错误。在wxSizer::GetMinSize()(/usr/local/lib/libwx_gtk2_core-2.8.so.0)中,在testwxwwwprojectapp::OnInit中为20 0x0000000000409d06(this=0x630840)at/home/nisshanka/projects/code/testWXWProject/testWXWProjectApp.cpp:27/home/nisshanka/projects/code/testWXWProject/testWXWProjectApp.cpp:27:626:beg:0x409d06 at/../testWXWProjectApp.cpp:27#20 0x0000000000409d06 in testwxwwprojectapp::OnInit(此=0x630840)在…/testWXWProjectApp.cpp:27/。/testWXWProjectApp.cpp:27:626:beg:0x409d06
中,您是正确的。我再次检查并修改了它,现在它正在工作。当使用code::Blocks wxSmith pluging添加项时,实际上会发生这种情况。作为总结,我必须小心使用setizer()对于每个大小调整器只有一次,谢谢您的帮助。我注意到,如果任何面板、框架等没有选中“默认大小”,wxSmith会自动创建与上面所示完全相同的错误代码。这很容易做到,因为如果在创建界面时拖动框的边缘,默认大小将被关闭。要修复-只需选中“默认大小”并重新构建。
Adding source dir: /home/nisshanka/projects/codes/testWXWProject/
Adding source dir: /home/nisshanka/projects/codes/testWXWProject/
Adding file: /home/nisshanka/projects/codes/testWXWProject/bin/Debug/testWXWProject
Changing directory to: /home/nisshanka/projects/codes/testWXWProject/.
Set variable: LD_LIBRARY_PATH=.:/usr/local/lib:/usr/lib64:
Starting debugger: /usr/bin/gdb -nx -fullname  -quiet  -args /home/nisshanka/projects/codes/testWXWProject/bin/Debug/testWXWProject
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
At /home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:26
At /home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:27
Continuing...
Program received signal SIGSEGV, Segmentation fault.
In wxSizer::GetMinSize() () (/usr/local/lib/libwx_gtk2_core-2.8.so.0)
#20 0x0000000000409d06 in testWXWProjectApp::OnInit (this=0x630840) at /home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:27
/home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:27:626:beg:0x409d06
At /home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:27
#20 0x0000000000409d06 in testWXWProjectApp::OnInit (this=0x630840) at /home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:27
/home/nisshanka/projects/codes/testWXWProject/testWXWProjectApp.cpp:27:626:beg:0x409d06
Continuing...
Program terminated with signal SIGSEGV, Segmentation fault.
Debugger finished with status 0
Panel2->SetSizer(BoxSizer4);
SetSizer(BoxSizer4);