Qt Установить геометрию для вновь созданного виджета

У меня есть MainWindow в qt с вложенным виджетом вкладок, содержащий вкладку с именем «tab_upload».
На этой вкладке я получил ярлык с текстом «Жанры» (это приложение библиотеки) с прикрепленной кнопкой «плюс». Я хочу иметь возможность получать новый QLineEdit каждый раз, когда я нажимаю эту кнопку, расположенную в ряд с другими. Получить правильные координаты легко, но я не могу правильно установить геометрию нового QLineEdit. Неважно, что я печатаю в функции setGeometry, QLineEdit всегда будет отображаться в центре.
А также, если я нажимаю кнопку второй раз, я получаю сообщение об ошибке

QWidget :: setLayout: Попытка установить QLayout «» на QWidget «tab_upload», который уже имеет макет.

 if(nr_genres < 4)
{
QLineEdit *newgen = new QLineEdit(ui->tab_upload);
int x = 5 + nr_genres * 90;
newgen->setGeometry(x,187,90,25);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(newgen);
ui->tab_upload->setLayout(layout);
}

2

Решение

Макеты предназначены для иметь контроль над позиционированием виджетов:

Все подклассы QWidget могут использовать макеты для управления своими дочерними элементами. Функция QWidget :: setLayout () применяет макет к виджету. Когда макет устанавливается на виджет таким образом, он отвечает за следующие задачи:

  • Позиционирование дочерних виджетов.
  • Разумные размеры по умолчанию для окон.
  • Разумные минимальные размеры для окон.
  • Изменение размера обработки.
  • Автоматические обновления при изменении содержимого:
    • Размер шрифта, текста или другого содержимого
      дочерние виджеты.
    • Скрытие или показ дочернего виджета.
    • Удаление дочерних виджетов.

Вы должны прочитать этот документация для информации о добавлении виджетов в макеты:

  1. Изначально всем виджетам будет выделено пространство в соответствии с их QWidget :: sizePolicy () и QWidget :: sizeHint ().
  2. Если для любого из виджетов установлены коэффициенты растяжения со значением больше нуля, то им выделяется пространство пропорционально их коэффициенту растяжения (объяснено ниже).
  3. Если у любого из виджетов коэффициенты растяжения установлены в ноль, они получат больше места, только если другие виджеты не хотят этого пространства. Из них пространство выделяется виджетам с политикой расширения размера в первую очередь.
  4. Любые виджеты, которым выделено меньше места, чем их минимальный размер (или подсказка о минимальном размере, если не указан минимальный размер), выделяются с минимальным размером, который им требуется (Виджеты не должны иметь указание минимального или минимального размера, и в этом случае фактор растяжения является их определяющим фактором.)
  5. Любым виджетам, которым выделено больше места, чем их максимальный размер, выделяется максимальный размер, который им требуется (Виджеты не обязательно должны иметь максимальный размер, и в этом случае фактор растяжения является их определяющим фактором.)

Я думаю, что самый простой способ управлять виджетами в макетах — это использовать режим «Дизайн» в Qt Creator и указать minimumSize и / или maximumSize для каждого виджета, вместе с sizePolicy, Таким образом, вы можете увидеть, что происходит, и поэкспериментировать с различными значениями.

Что касается ошибки, которую вы получаете, она упоминается в документация для setLayout():

Если в этом виджете уже установлен менеджер макета, QWidget не позволит вам установить другой. Прежде чем вы сможете вызвать setLayout () с новым макетом, вы должны сначала удалить существующий менеджер компоновки (возвращаемый layout ()).

1

Другие решения

QWidget :: setLayout: Попытка установить QLayout «» на QWidget
«tab_upload», который уже имеет макет.

Вы устанавливаете новый макет в виджете, который уже содержит макет из предыдущего нажатия на кнопку «плюс». Эту проблему можно решить следующим образом:

QLineEdit *newgen = new QLineEdit(ui->tab_upload);
QVBoxLayout *layout = static_cast<QVBoxLayout*>(ui->tab_upload->layout());
if(!layout) {
layout = new QVBoxLayout(ui->tab_upload);
ui->tab_upload->setLayout(layout);
}
layout->addWidget(newgen);

Но вы не можете напрямую установить геометрию для вашего QLineEdit потому что геометрия была установлена ​​макетом. Если я понимаю проблему, этот код должен вам помочь. Это создает новый QLineEdit после каждого нажатия на кнопку «плюс» и добавлять QLineEdit к существующему макету.

1

По вопросам рекламы [email protected]