Я изо всех сил пытаюсь изменить размер моего wxListView при изменении размера моего wxFrame. Мне удалось изменить размер родительской панели 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();
}

При печати размера bledevListView в событии OnSize будут выведены правильные значения. Однако пользовательский интерфейс не обновляет ListView для соответствия этим значениям. Я пробовал использовать SetSize (), Update (), Refresh () в bledevListView, а также пытался изменить размер wxListView без использования wxSizer, но ничего не сработало. Какие-нибудь советы?

0
Mizkei 14 Июн 2020 в 13:51

1 ответ

Лучший ответ

Как другие отметили в комментариях, вы можете сделать макет самостоятельно в обработчике wxEVT_SIZE или (и это исключающее ИЛИ) использовать сайзеры. Чтобы сделать последнее, начните с полного удаления обработчика кадра OnSize(). Возможно, вам все еще понадобится обработчик wxEVT_SIZE для самого представления списка, который может изменять размер своих столбцов по вашему желанию.

Вторая проблема в коде, который вы показываете, еще хуже: вы передаете право собственности на wxListView unique_ptr<>. Если вы не вызовете для него release() позже, это будет очень неправильно: все элементы GUI принадлежат wxWidgets и будут им удалены. Вам необходимо использовать необработанные указатели или, если вы предпочитаете, не принадлежащий тип интеллектуального указателя (observer_ptr<>) для всех wxWindow - производных объектов в вашей программе (но это также относится к сайзерам и, в основном, ко всему что вы "отдаете" фреймворку, чтобы он им управлял).

0
VZ. 15 Июн 2020 в 10:38