我正在尝试实现一个自定义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
期望的结果是彼此相邻地绘制减号按钮和加号按钮。但是,似乎加号按钮被绘制在减号按钮的顶部。
如何修复以便按钮彼此相邻?
答案 0 :(得分:1)
我认为这只是因为你的CustomWidget
永远不会得到一个调整大小事件,所以从来没有布局过,所以只要明确地调用它Layout()
(或者在它的结尾处)或者在创建之后)应该解决问题。
FWIW通常这个问题不会出现,因为小工具是由大小调整者定位的,当它们被放置到位时会得到一个调整大小的事件,但是当你在一个固定的位置创建它时,它就会出现这个问题。不是由sizer管理,它永远不会有任何规模的事件。
最后,我不确定您为什么需要加/减按钮,但如果您要将它们与任何类似列表框的控件一起使用,您可能会对wxAddRemoveCtrl感兴趣在最新的git master中可用,它试图实现所有主要平台的原生外观。