Я изо всех сил пытаюсь изменить размер моего 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, но ничего не сработало. Какие-нибудь советы?
1 ответ
Как другие отметили в комментариях, вы можете сделать макет самостоятельно в обработчике wxEVT_SIZE
или (и это исключающее ИЛИ) использовать сайзеры. Чтобы сделать последнее, начните с полного удаления обработчика кадра OnSize()
. Возможно, вам все еще понадобится обработчик wxEVT_SIZE
для самого представления списка, который может изменять размер своих столбцов по вашему желанию.
Вторая проблема в коде, который вы показываете, еще хуже: вы передаете право собственности на wxListView
unique_ptr<>
. Если вы не вызовете для него release()
позже, это будет очень неправильно: все элементы GUI принадлежат wxWidgets и будут им удалены. Вам необходимо использовать необработанные указатели или, если вы предпочитаете, не принадлежащий тип интеллектуального указателя (observer_ptr<>
) для всех wxWindow
- производных объектов в вашей программе (но это также относится к сайзерам и, в основном, ко всему что вы "отдаете" фреймворку, чтобы он им управлял).
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .