自定义wxWidgets小部件中的两个按钮彼此相邻

时间:2015-07-11 15:38:18

标签: c++ wxwidgets

我正在尝试实现一个自定义wxWidgets小部件,其中一个减号按钮和一个加号按钮彼此相邻放置。

为了实现这一点,我让我的自定义窗口小部件类继承自wxPanel,并使用水平wxBoxSizer放置两个按钮:

#include <wx/wx.h>

class CustomWidget : public wxPanel{
private:
    wxButton* m_minusButton;
    wxButton* m_plusButton;
public:

    CustomWidget(wxWindow *parent, const wxPoint& pos):  wxPanel(parent, wxID_ANY, pos, wxSize(-1, -1), wxBORDER_NONE){

    wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);

    m_minusButton = new wxButton(this, wxID_ANY, wxT("-"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
    m_plusButton = new wxButton(this, wxID_ANY, wxT("+"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );

    hbox->Add(m_minusButton, 1, wxALL, 5);
    hbox->Add(m_plusButton, 1, wxALL, 5);
    hbox->SetSizeHints(this);

    this->SetSizer(hbox);
    }
};

我的应用程序分为左窗格和右窗格。我将自定义小部件放在右侧窗格中。这是我的应用程序的大大简化版本:

class TestFrame: public wxFrame{
    wxPanel *m_lp;
    wxPanel *m_rp;
public:
    TestFrame(): wxFrame(NULL, wxID_ANY, "Title", wxDefaultPosition, wxSize(400,400)){
    wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);

    m_lp = new wxPanel(this,-1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN);
    m_rp = new wxPanel(this,-1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN);

    hbox->Add(m_lp, 1, wxEXPAND | wxALL, 5);
    hbox->Add(m_rp, 1, wxEXPAND | wxALL, 5);

    this->SetSizer(hbox);

    new CustomWidget(m_rp, wxPoint(50,100));
    }
};

class TestApp: public wxApp{
public:
    virtual bool OnInit() {
    TestFrame *frame = new TestFrame();
    frame->Show( true );
    return true;
    }
};

wxIMPLEMENT_APP(TestApp);

如果您编译并运行此程序,结果可以在下图中看到:

http://i.imgur.com/JcRJJKi.png

期望的结果是彼此相邻地绘制减号按钮和加号按钮。但是,似乎加号按钮被绘制在减号按钮的顶部。

如何修复以便按钮彼此相邻?

1 个答案:

答案 0 :(得分:1)

我认为这只是因为你的CustomWidget永远不会得到一个调整大小事件,所以从来没有布局过,所以只要明确地调用它Layout()(或者在它的结尾处)或者在创建之后)应该解决问题。

FWIW通常这个问题不会出现,因为小工具是由大小调整者定位的,当它们被放置到位时会得到一个调整大小的事件,但是当你在一个固定的位置创建它时,它就会出现这个问题。不是由sizer管理,它永远不会有任何规模的事件。

最后,我不确定您为什么需要加/减按钮,但如果您要将它们与任何类似列表框的控件一起使用,您可能会对wxAddRemoveCtrl感兴趣在最新的git master中可用,它试图实现所有主要平台的原生外观。