使用大小调整大小调整 wxListView 的大小

resizing wxListView with sizer

本文关键字:调整 wxListView      更新时间:2023-10-16

在调整wxFrame大小时,我正在努力调整wxListView的大小。我设法调整了ListView的父面板的大小,并且同一面板中的wxButton也随着预期调整窗口大小而移动。

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 size 将打印正确的值。但是,UI 不会更新列表视图以匹配这些值。我尝试在bledevListView上使用SetSize((,Update((,Refresh((,并且还尝试在不使用wxSizer的情况下调整wxListView的大小,但没有任何效果。有什么提示吗?

正如其他人在注释中指出的那样,您可以在处理程序中显式地进行布局wxEVT_SIZE或者(这是唯一的或(使用大小器。要执行后者,请首先完全删除框架的OnSize()处理程序。您可能仍然希望拥有列表视图本身的wxEVT_SIZE处理程序,它可以根据需要调整其列的大小。

您展示的代码中的第二个问题更糟:您将wxListView的所有权交给unique_ptr<>。除非你稍后调用release(),否则这是非常错误的:所有GUI元素都归wxWidgets所有,并且将被它删除。您需要使用原始指针,或者,如果您愿意,可以使用非拥有智能指针类型(observer_ptr<>(来表示程序中的所有wxWindow派生对象(但这也适用于大小器,基本上也适用于您"提供"给框架的任何内容由它管理(。