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)
- 面板2(盒尺寸4)
这样可以更容易地检查您是否将正确的控件添加到正确的大小写器,并将大小写器正确设置到容器中。在这里,您可以快速发现
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);