Перейти к содержанию
    

Qt - прокрутка части окна

Имеется окно (виджет), в которое помещаются (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);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Берёте виджет, кладёте на него ещё два виджета. Делаете вертикальный layout.

Потом в верхний виджет лейблы, в нижний - всё остальное. В каждом задать по вкусу свой layout.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AHTOXA said:

Потом в верхний виджет лейблы, в нижний - всё остальное.

...плюс добавить костылей, чтобы выравнивание по горизонтали не расползалось.

Я такую же задачу решал, только у меня было около 10 столбцов и полсотни строк. Конструкция из виджетов и лэйаутов довольно сильно тормозит, пришлось переделать на QTableWidget. Визуально - то же самое, но работает заметно быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Harvester сказал:

Я правильно понял?

Да, так. Только раз у вас *.ui, то там и делайте это мышой :-)

17 минут назад, esaulenka сказал:

...плюс добавить костылей

Да, без костылей там никак :-) Я до сих пор не постиг дзен этих лейаутов. То ли дело было в дельфях - всё просто и логично. Правда, там не получалось сделать пропорционально растягивающиеся панельки. Хотя и в Qt это у меня далеко не всегда получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, AHTOXA said:

Да, так. Только раз у вас *.ui, то там и делайте это мышой :-)

Похоже, что магия редактора форм выше моего понимания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/12/2020 at 11:23 PM, AHTOXA said:

Да, так. Только раз у вас *.ui, то там и делайте это мышой :-)

Что-то не получается. :(

Не получается растянуть scrollarea на все доступное пространство.

image.thumb.png.eddfa0d58093a11eaec29a80842d2ccc.png

Если убрать нижнюю растяжку, то все просто смещается вниз, если дополнительно убрать верхнюю, то CAPTION и SUBCAPTION расползаются по верхней половине, а scrollarea все равно не меняется

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте убрать виджет wgt_buttons, прямо scrollArea поместите в layout

Вот, примерно так:

2020-04-14-161415_1091x713_scrot.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Harvester said:

Если убрать нижнюю растяжку, то все просто смещается вниз, если дополнительно убрать верхнюю, то CAPTION и SUBCAPTION расползаются по верхней половине, а scrollarea все равно не меняется

 у вас  verticalLayout_2 имеет поле layoutStrech - туда надо записать 1,0 вместо 0,0

Изменено пользователем gridinp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);
}

 

Выдернул из одного проекта (может надо что почистить), но вроде работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...