使用 sizer 调整 wxListView 的大小
resizing wxListView with sizer
我在调整 wxFrame 大小时难以调整 wxListView 的大小。我设法调整了 ListView 的父面板的大小,同一面板中的 wxButton 也随着按预期调整 window 的大小而移动。
BluetoothConnectFrame::BluetoothConnectFrame(const wxString& title, const wxPoint& pos, const wxSize& size, Frame* parent)
: wxFrame(NULL, wxID_ANY, title, pos, size),
bleConnector(std::make_unique<BluetoothConnector>()),
mainPanel(new wxPanel(this, wxID_ANY, wxPoint(0,0), wxSize(size.x, size.y / 4 * 3), wxTAB_TRAVERSAL, "Main Panel")),
sizer (new wxBoxSizer(wxVERTICAL))
{
bledevListView = std::make_unique<wxListView>(new wxListView(mainPanel, ID_Bluetooth,
wxPoint(size.GetWidth() - size.GetWidth() + 20, size.GetHeight() - size.GetHeight() + 20),
wxSize(size.GetWidth() - 50, size.GetHeight() / 2)));
bledevListView->AppendColumn("Address");
bledevListView->SetColumnWidth(0, getBLEListViewSize().x/ 2);
bledevListView->AppendColumn("Name");
bledevListView->SetColumnWidth(1, getBLEListViewSize().x / 2);
stopDiscButton = new wxButton(mainPanel, wxID_ANY, "Stop discovery", wxPoint(0,0), STOPDISCSIZE, wxBU_LEFT, wxDefaultValidator, "Stop disc");
sizer->Add(bledevListView.get(), 1 ,wxEXPAND, 1);
sizer->Add(stopDiscButton );
mainPanel->SetSizer(sizer);
}
wxSizeEvent 函数
void BluetoothConnectFrame::OnSize(wxSizeEvent & e) {
size = e.GetSize();
mainPanel->SetSize(getMainPanelSize());
sizer->Layout();
}
在 OnSize 事件中打印出 bledevListView 大小将打印出正确的值。但是 UI 不会更新 ListView 以匹配这些值。我已经尝试在 bledevListView 上使用 SetSize()、Update()、Refresh(),还尝试在不使用 wxSizer 的情况下调整 wxListView 的大小,但没有任何效果。有什么建议吗?
正如其他人在评论中指出的那样,您可以在 wxEVT_SIZE
处理程序中明确自己进行布局,或者(这是独占或)使用 sizer。要执行后者,首先要完全删除框架的 OnSize()
处理程序。您可能仍然想要的是列表视图本身的 wxEVT_SIZE
处理程序,它可以根据需要调整其列的大小。
您显示的代码中的第二个问题更糟:您将 wxListView
的所有权授予 unique_ptr<>
。除非你稍后在它上面调用 release()
,这是非常错误的:所有 GUI 元素都归 wxWidgets 所有,并将被它删除。您需要对程序中的所有 wxWindow
派生对象使用原始指针,或者,如果您愿意,也可以使用非拥有智能指针类型 (observer_ptr<>
)(但这也适用于 sizer,基本上,任何东西您 "give" 到由它管理的框架。
我在调整 wxFrame 大小时难以调整 wxListView 的大小。我设法调整了 ListView 的父面板的大小,同一面板中的 wxButton 也随着按预期调整 window 的大小而移动。
BluetoothConnectFrame::BluetoothConnectFrame(const wxString& title, const wxPoint& pos, const wxSize& size, Frame* parent)
: wxFrame(NULL, wxID_ANY, title, pos, size),
bleConnector(std::make_unique<BluetoothConnector>()),
mainPanel(new wxPanel(this, wxID_ANY, wxPoint(0,0), wxSize(size.x, size.y / 4 * 3), wxTAB_TRAVERSAL, "Main Panel")),
sizer (new wxBoxSizer(wxVERTICAL))
{
bledevListView = std::make_unique<wxListView>(new wxListView(mainPanel, ID_Bluetooth,
wxPoint(size.GetWidth() - size.GetWidth() + 20, size.GetHeight() - size.GetHeight() + 20),
wxSize(size.GetWidth() - 50, size.GetHeight() / 2)));
bledevListView->AppendColumn("Address");
bledevListView->SetColumnWidth(0, getBLEListViewSize().x/ 2);
bledevListView->AppendColumn("Name");
bledevListView->SetColumnWidth(1, getBLEListViewSize().x / 2);
stopDiscButton = new wxButton(mainPanel, wxID_ANY, "Stop discovery", wxPoint(0,0), STOPDISCSIZE, wxBU_LEFT, wxDefaultValidator, "Stop disc");
sizer->Add(bledevListView.get(), 1 ,wxEXPAND, 1);
sizer->Add(stopDiscButton );
mainPanel->SetSizer(sizer);
}
wxSizeEvent 函数
void BluetoothConnectFrame::OnSize(wxSizeEvent & e) {
size = e.GetSize();
mainPanel->SetSize(getMainPanelSize());
sizer->Layout();
}
在 OnSize 事件中打印出 bledevListView 大小将打印出正确的值。但是 UI 不会更新 ListView 以匹配这些值。我已经尝试在 bledevListView 上使用 SetSize()、Update()、Refresh(),还尝试在不使用 wxSizer 的情况下调整 wxListView 的大小,但没有任何效果。有什么建议吗?
正如其他人在评论中指出的那样,您可以在 wxEVT_SIZE
处理程序中明确自己进行布局,或者(这是独占或)使用 sizer。要执行后者,首先要完全删除框架的 OnSize()
处理程序。您可能仍然想要的是列表视图本身的 wxEVT_SIZE
处理程序,它可以根据需要调整其列的大小。
您显示的代码中的第二个问题更糟:您将 wxListView
的所有权授予 unique_ptr<>
。除非你稍后在它上面调用 release()
,这是非常错误的:所有 GUI 元素都归 wxWidgets 所有,并将被它删除。您需要对程序中的所有 wxWindow
派生对象使用原始指针,或者,如果您愿意,也可以使用非拥有智能指针类型 (observer_ptr<>
)(但这也适用于 sizer,基本上,任何东西您 "give" 到由它管理的框架。