wxWidgets подгоняет большой wxGrid в wxFlexGridSizer

Проблема

У меня есть wxGrid со многими строками (> 200), помещенными внутри wxFlexGridSizer. Проблема в том, что у меня пропадает кнопка под сеткой. То же самое с wxBoxSizer работает с использованием настройки proportion.

Результат должен выглядеть как решение wxBoxSizer. Есть ли способ использовать wxFlexGridSizer в такой ситуации?

wxBoxSizer (работает)

Снимок экрана wxBoxSizer

    wxGrid *grid = new wxGrid(this, wxID_ANY);
    grid->CreateGrid(0, 2);
    grid->SetDefaultRowSize(20);
    grid->AppendRows(200);

    wxButton *button = new wxButton(this, wxID_ANY, "button");

    wxBoxSizer *bsMain = new wxBoxSizer(wxHORIZONTAL);
    bsMain->Add(grid, 1, wxALL, 5);
    bsMain->Add(button, 0, wxALL, 5);

    SetSizer(bsMain);

wxGridSizer (не работает)

Снимок экрана wxFlexGridSizer

    wxGrid *grid = new wxGrid(this, wxID_ANY);
    grid->CreateGrid(0, 2);
    grid->SetDefaultRowSize(20);
    grid->AppendRows(200);

    wxButton *button = new wxButton(this, wxID_ANY, "button");

    wxFlexGridSizer *fgsMain = new wxFlexGridSizer(1, 0, 0);
    fgsMain->Add(grid, 1, wxALL, 5);
    fgsMain->Add(button, 0, wxALL, 5);
    fgsMain->AddGrowableRow(0);
    fgsMain->AddGrowableCol(0);

    SetSizer(fgsMain);

Я пытался использовать AddGrowableRow для обеих строк, настройку пропорций, флаг wxEXPAND.

Здесь есть аналогичный вопрос, но решение является обходным путем:

Подгонка большой сетки (wxGrid) в диалоговом окне (wxDialog)< /а>

(скриншоты сделаны с wxFormBuilder v3.8.1)


person lumapu    schedule 09.08.2019    source источник
comment
Вы не устанавливаете начальный размер ни для сетки, ни для кнопки. Попробуйте этот обходной путь (установите хотя бы минимальные размеры), не забудьте Layout() или SetSizerAndFit(...).   -  person Ripi2    schedule 09.08.2019
comment
Обе команды не решают мою проблему.   -  person lumapu    schedule 12.08.2019


Ответы (1)


По умолчанию wxGrid попытается отобразить на экране все свои 200 строк, что не оставит достаточно места для кнопки. Вы можете вызвать SetInitialSize() (или указать начальный размер при создании сетки в его ctor), чтобы изменить это.

Не имеет отношения к этому вопросу, но я настоятельно рекомендую вам использовать более читаемый API на основе wxSizerFlags, а не старые перегрузки Add(). Вы также не должны жестко задавать размер границы в пикселях, это всегда неправильно для некоторых платформ и становится еще хуже на дисплеях с высоким разрешением (и использование wxSizerFlags позаботилось бы об этом автоматически).

person VZ.    schedule 09.08.2019
comment
SetInitialSize() ничего не меняет. Я попробовал это для обоих (кнопка и сетка). Спасибо за подсказку с wxSizerFlags, которую я никогда раньше не слышал. - person lumapu; 12.08.2019