У меня есть 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);
}
Макеты предназначены для иметь контроль над позиционированием виджетов:
Все подклассы QWidget могут использовать макеты для управления своими дочерними элементами. Функция QWidget :: setLayout () применяет макет к виджету. Когда макет устанавливается на виджет таким образом, он отвечает за следующие задачи:
- Позиционирование дочерних виджетов.
- Разумные размеры по умолчанию для окон.
- Разумные минимальные размеры для окон.
- Изменение размера обработки.
- Автоматические обновления при изменении содержимого:
- Размер шрифта, текста или другого содержимого
дочерние виджеты.- Скрытие или показ дочернего виджета.
- Удаление дочерних виджетов.
Вы должны прочитать этот документация для информации о добавлении виджетов в макеты:
- Изначально всем виджетам будет выделено пространство в соответствии с их QWidget :: sizePolicy () и QWidget :: sizeHint ().
- Если для любого из виджетов установлены коэффициенты растяжения со значением больше нуля, то им выделяется пространство пропорционально их коэффициенту растяжения (объяснено ниже).
- Если у любого из виджетов коэффициенты растяжения установлены в ноль, они получат больше места, только если другие виджеты не хотят этого пространства. Из них пространство выделяется виджетам с политикой расширения размера в первую очередь.
- Любые виджеты, которым выделено меньше места, чем их минимальный размер (или подсказка о минимальном размере, если не указан минимальный размер), выделяются с минимальным размером, который им требуется (Виджеты не должны иметь указание минимального или минимального размера, и в этом случае фактор растяжения является их определяющим фактором.)
- Любым виджетам, которым выделено больше места, чем их максимальный размер, выделяется максимальный размер, который им требуется (Виджеты не обязательно должны иметь максимальный размер, и в этом случае фактор растяжения является их определяющим фактором.)
Я думаю, что самый простой способ управлять виджетами в макетах — это использовать режим «Дизайн» в Qt Creator и указать minimumSize
и / или maximumSize
для каждого виджета, вместе с sizePolicy
, Таким образом, вы можете увидеть, что происходит, и поэкспериментировать с различными значениями.
Что касается ошибки, которую вы получаете, она упоминается в документация для setLayout()
:
Если в этом виджете уже установлен менеджер макета, QWidget не позволит вам установить другой. Прежде чем вы сможете вызвать setLayout () с новым макетом, вы должны сначала удалить существующий менеджер компоновки (возвращаемый layout ()).
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
к существующему макету.