Harvester 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба Имеется окно (виджет), в которое помещаются (QVBoxLayout) одна или две QLabel и неограниченное число QButton. Содержимое центрируется по вертикали. Когда кнопок становится слишком много появляется полоса прокрутки. Мне нужно изменить код так, чтобы QLabel всегда оставались на экране, а полоса прокрутки появлялась только только для кнопок. Я понимаю, что нужно взять два менеджера компоновки, а что с ними делать дальше - уже нет :( . Вот текущий код (то, что qt генерит из *.ui, с сокращениями): Виджеты добавляются в лэйаут menu_splitter. class Ui_dlgMenu { public: QVBoxLayout *verticalLayout; QScrollArea *scrollArea; QWidget *scr_wdg_contents; QVBoxLayout *verticalLayout_3; QVBoxLayout *menu_splitter; void setupUi(QWidget *dlgMenu) { dlgMenu->resize(272, 480); dlgMenu->setMaximumSize(QSize(272, 480)); verticalLayout = new QVBoxLayout(dlgMenu); scrollArea = new QScrollArea(dlgMenu); sizePolicy1.setHorizontalStretch(0); sizePolicy1.setVerticalStretch(0); sizePolicy1.setHeightForWidth(scrollArea->sizePolicy().hasHeightForWidth()); scrollArea->setSizePolicy(sizePolicy1); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea->setWidgetResizable(true); scr_wdg_contents = new QWidget(); scr_wdg_contents->setGeometry(QRect(0, 0, 268, 470)); verticalLayout_3 = new QVBoxLayout(scr_wdg_contents); menu_splitter = new QVBoxLayout(); verticalLayout_3->addLayout(menu_splitter); scrollArea->setWidget(scr_wdg_contents); verticalLayout->addWidget(scrollArea); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба Берёте виджет, кладёте на него ещё два виджета. Делаете вертикальный layout. Потом в верхний виджет лейблы, в нижний - всё остальное. В каждом задать по вкусу свой layout. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 6 minutes ago, AHTOXA said: Берёте виджет, кладёте на него ещё два виджета. Делаете вертикальный layout. Потом в верхний виджет лейблы, в нижний - всё остальное. В каждом задать по вкусу свой layout. Я правильно понял? scr_wdg_contents = new QWidget(); scr_wdg_contents->setGeometry(QRect(0, 0, 268, 470)); // Основной виджет scr_wdg_header = new QWidget(); // Для лейблов header_splitter = new QVBoxLayout(scr_wdg_header); scr_wdg_data = new QWidget(); //для кнопок data_splitter = new QVBoxLayout(data_splitter); verticalLayout_3 = new QVBoxLayout(scr_wdg_contents); verticalLayout_3->addWidget(scr_wdg_header); verticalLayout_3->addWidget(scr_wdg_data); scrollArea->setWidget(scr_wdg_data); data_splitter->addWidget(scrollArea); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 1 hour ago, AHTOXA said: Потом в верхний виджет лейблы, в нижний - всё остальное. ...плюс добавить костылей, чтобы выравнивание по горизонтали не расползалось. Я такую же задачу решал, только у меня было около 10 столбцов и полсотни строк. Конструкция из виджетов и лэйаутов довольно сильно тормозит, пришлось переделать на QTableWidget. Визуально - то же самое, но работает заметно быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 1 час назад, Harvester сказал: Я правильно понял? Да, так. Только раз у вас *.ui, то там и делайте это мышой :-) 17 минут назад, esaulenka сказал: ...плюс добавить костылей Да, без костылей там никак :-) Я до сих пор не постиг дзен этих лейаутов. То ли дело было в дельфях - всё просто и логично. Правда, там не получалось сделать пропорционально растягивающиеся панельки. Хотя и в Qt это у меня далеко не всегда получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 13 апреля, 2020 Опубликовано 13 апреля, 2020 · Жалоба 13 hours ago, AHTOXA said: Да, так. Только раз у вас *.ui, то там и делайте это мышой :-) Похоже, что магия редактора форм выше моего понимания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 14 апреля, 2020 Опубликовано 14 апреля, 2020 · Жалоба On 4/12/2020 at 11:23 PM, AHTOXA said: Да, так. Только раз у вас *.ui, то там и делайте это мышой :-) Что-то не получается. :( Не получается растянуть scrollarea на все доступное пространство. Если убрать нижнюю растяжку, то все просто смещается вниз, если дополнительно убрать верхнюю, то CAPTION и SUBCAPTION расползаются по верхней половине, а scrollarea все равно не меняется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 14 апреля, 2020 Опубликовано 14 апреля, 2020 · Жалоба Попробуйте убрать виджет wgt_buttons, прямо scrollArea поместите в layout Вот, примерно так: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 3 14 апреля, 2020 Опубликовано 14 апреля, 2020 (изменено) · Жалоба 3 hours ago, Harvester said: Если убрать нижнюю растяжку, то все просто смещается вниз, если дополнительно убрать верхнюю, то CAPTION и SUBCAPTION расползаются по верхней половине, а scrollarea все равно не меняется у вас verticalLayout_2 имеет поле layoutStrech - туда надо записать 1,0 вместо 0,0 Изменено 14 апреля, 2020 пользователем gridinp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
technik-1017 0 14 апреля, 2020 Опубликовано 14 апреля, 2020 · Жалоба Spoiler TMainWindow::TMainWindow() { QWidget *wgtMain = new QWidget; setCentralWidget(wgtMain); QFrame *FPage = new QFrame; FPage->setFrameStyle(QScrollArea::Box | QScrollArea::Sunken); QLabel *FWidgetPageTitle = new QLabel("Hello"); FWidgetPageTitle->setFrameStyle(QFrame::NoFrame); QLabel *FWidgetPageLine = new QLabel(); FWidgetPageLine->setFrameStyle(QFrame::HLine | QFrame::Plain); FWidgetPageLine->setLineWidth(2); QVBoxLayout *FLayoutPageTitle = new QVBoxLayout(); FLayoutPageTitle->setContentsMargins(0,0,0,0); FLayoutPageTitle->setSpacing(0); FLayoutPageTitle->addWidget(FWidgetPageTitle); FLayoutPageTitle->addWidget(FWidgetPageLine); QScrollArea *FPageData = new QScrollArea(); FPageData->setFrameStyle(QScrollArea::NoFrame); FPageData->setWidgetResizable(true); QVBoxLayout *FLayoutPage = new QVBoxLayout(FPage); FLayoutPage->setContentsMargins(10,10,10,10); FLayoutPage->setSpacing(0); FLayoutPage->addLayout(FLayoutPageTitle); FLayoutPage->addWidget(FPageData); //---------------------- QPushButton *b1 = new QPushButton("b1"); QPushButton *b2 = new QPushButton("b2"); QPushButton *b3 = new QPushButton("b3"); QPushButton *b4 = new QPushButton("b4"); QPushButton *b5 = new QPushButton("b5"); QPushButton *b6 = new QPushButton("b6"); QPushButton *b7 = new QPushButton("b7"); QPushButton *b8 = new QPushButton("b8"); QPushButton *b9 = new QPushButton("b9"); b9->setFixedWidth(150); QVBoxLayout *FLayoutMain = new QVBoxLayout(); FLayoutMain->setContentsMargins(0,0,0,0); FLayoutMain->setSpacing(5); FLayoutMain->addWidget(b1); FLayoutMain->addWidget(b2); FLayoutMain->addWidget(b3); FLayoutMain->addWidget(b4); FLayoutMain->addWidget(b5); FLayoutMain->addWidget(b6); FLayoutMain->addWidget(b7); FLayoutMain->addWidget(b8); FLayoutMain->addWidget(b9); FLayoutMain->addStretch(1); QFrame *f = new QFrame; f->setLayout(FLayoutMain); FPageData->setWidget(f); wgtMain->setLayout(FLayoutPage); } Выдернул из одного проекта (может надо что почистить), но вроде работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться