【问题标题】:wxWidgets C++ panel is invisiblewxWidgets C++ 面板是不可见的
【发布时间】:2016-12-01 23:40:02
【问题描述】:

我开始使用 wxWidgets 练习我的技能,我想在此滑块上方添加一些带有两个不同文本的面板,但是当我尝试时,结果是不可见的:

MainWindow::MainWindow(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition) {
    wxMenuBar *menubar;
    wxMenu *file;
    menubar = new wxMenuBar;
    file = new wxMenu;
    file->Append(wxID_OPEN, wxT("&Open"));
    menubar->Append(file, wxT("&File"));
    SetMenuBar(menubar);

    wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
    this->SetSizer(vbox);
    player_widget = new wxWindow(this, wxID_ANY);
    player_widget->SetBackgroundColour(wxColour(wxT("black")));
    vbox->Add(player_widget, 1, wxEXPAND | wxALIGN_TOP);

    wxBoxSizer* bs = new wxBoxSizer(wxHORIZONTAL);
    wxPanel* p1 = new wxPanel(this,wxID_ANY,wxDefaultPosition,wxSize(0,20));
    p1->SetSizer(bs);
    p1->Enable(true);
    p1->Show(true);
    vbox->Add(p1,0,wxEXPAND);

    wxStaticText* text1 = new wxStaticText(this,11, "text 1");
    wxStaticText* text2 = new wxStaticText(this,12, "text 2");
    bs->Add(text1);
    bs->Add(text2);

    timeline = new wxSlider(this, myID_TIMELINE, 0, 0, TIMELINE_MAX);
    vbox->Add(timeline, 0, wxEXPAND);

    wxPanel *controlPanel = new wxPanel(this, wxID_ANY);
    wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
    controlPanel->SetSizer(hbox);
    vbox->Add(controlPanel, 0, wxEXPAND);
    playpause_button = new wxButton(controlPanel, myID_PLAYPAUSE, wxT("Play"));
    stop_button = new wxButton(controlPanel, myID_STOP, wxT("Stop"));
    volume_slider = new wxSlider(controlPanel, myID_VOLUME, VOLUME_MAX, 0, VOLUME_MAX, wxDefaultPosition, wxSize(100, -1));
    hbox->Add(playpause_button);
    hbox->Add(stop_button);
    hbox->AddStretchSpacer();
    hbox->Add(volume_slider);
}

任何想法我做错了什么?

【问题讨论】:

  • 在设计 GUI 时,您可能需要考虑使用 wxFormBuilder,然后复制并粘贴代码。
  • 或 wxGlade 或 wxCrafter

标签: c++ wxwidgets


【解决方案1】:

text1text2 的父级更改为p1

【讨论】:

    【解决方案2】:

    只使用一个可以容纳所有东西的面板会更简单。

    类似这样的东西(一个完整的程序)

    #include <wx/wx.h>
    #include <wx/app.h>
    
    class cApp : public wxApp
    {
    public:
        virtual bool OnInit();
    
    };
    
    #define TIMELINE_MAX 100
    #define VOLUME_MAX 100
    
    enum {
    myID_TIMELINE,
    myID_PLAYPAUSE,
    myID_STOP,
    myID_VOLUME
    };
    
    class cFrame: public wxFrame
    {
    
        wxWindow * player_widget;
        wxSlider * timeline;
        wxSlider * volume_slider;
        wxButton * playpause_button;
        wxButton * stop_button;
    
    public:
        cFrame(wxFrame *frame, const wxString& title)
            : wxFrame(frame, -1, title, wxPoint(-1,-1),wxSize(600,600))
            {
        wxMenuBar *menubar;
        wxMenu *file;
        menubar = new wxMenuBar;
        file = new wxMenu;
        file->Append(wxID_OPEN, wxT("&Open"));
        menubar->Append(file, wxT("&File"));
        SetMenuBar(menubar);
    
        // define one panel to hold everything
        // make it big enough to fill the frame
        wxPanel* p1 = new wxPanel(this,wxID_ANY, wxPoint(-1,-1),wxSize(600,600) );
    
        // top level sizer to hold everything
        wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
    
        // add window widget at top
        player_widget = new wxWindow(p1, wxID_ANY);
        player_widget->SetBackgroundColour(wxColour(wxT("black")));
        vbox->Add(player_widget, 1, wxEXPAND | wxALIGN_TOP);
    
        // add some texts in a horizontal row
        wxBoxSizer* bs = new wxBoxSizer(wxHORIZONTAL);
        wxStaticText* text1 = new wxStaticText(p1,11, "text 1");
        wxStaticText* text2 = new wxStaticText(p1,12, "text 2");
        bs->Add(text1);
        bs->Add(text2);
    
        // add texts just below window widget
        vbox->Add( bs );
    
        // add slider below texts
        timeline = new wxSlider(this, myID_TIMELINE, 0, 0, TIMELINE_MAX);
        vbox->Add(timeline, 0, wxEXPAND);
    
        // some more controls in a row
        wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
        playpause_button = new wxButton(p1, myID_PLAYPAUSE, wxT("Play"));
        stop_button = new wxButton(p1, myID_STOP, wxT("Stop"));
        volume_slider = new wxSlider(p1, myID_VOLUME, VOLUME_MAX,
               0, VOLUME_MAX, wxDefaultPosition, wxSize(100, -1));
        hbox->Add(playpause_button);
        hbox->Add(stop_button);
        hbox->AddStretchSpacer();
        hbox->Add(volume_slider);
    
        // add controls below big slider
        vbox->Add( hbox );
    
        // make everything happen
        SetSizer(vbox);
            }
    };
    
    IMPLEMENT_APP(cApp);
    
    bool cApp::OnInit()
    {
        cFrame* frame = new cFrame(0L, _("wx Starter"));
        frame->Show();
    
        return true;
    }
    

    这给出了:

    关于计算机编程的事情是这样的:有时您总是需要静下心来编写一些代码。所有那些承诺为您编写代码的应用程序,例如 wxFormBuilder,在某些时候都必须被放弃,而您实际上必须做一些工作(Here is a link to more about this

    【讨论】:

    • 你是对的。但是对于一个刚刚接触wx框架并想学习和理解它的人来说,使用工具然后查看生成的代码,然后从第一天开始从头开始编写sizer代码会更容易。你不同意吗?
    • 对不起,我不同意。查看自动代码生成器生成的代码没有帮助。自动代码旨在由代码生成器轻松维护 - 不用于教学目的。新手编码人员最好查看由人类编写并旨在供人类学习的示例代码。
    猜你喜欢
    • 2013-02-19
    • 2016-10-29
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2018-09-03
    相关资源
    最近更新 更多