Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: thechicho от Май 25, 2013, 13:10



Название: Как добавить QScrollArea
Отправлено: thechicho от Май 25, 2013, 13:10
Код:
    QGroupBox *groupBoxChoiceRegion = new QGroupBox(dialog);
    groupBoxChoiceRegion->setTitle("Выбор региона:");
    groupBoxChoiceRegion->setObjectName("groupBoxChoiceRegion");

    QGridLayout *gridLayoutChoiceRegion = new QGridLayout(groupBoxChoiceRegion);
    gridLayoutChoiceRegion->setObjectName("gridLayoutChoiceRegion");
    gridLayoutChoiceRegion->setSizeConstraint(QLayout::SetFixedSize);

есть QGroupBox. на него динамически будут добавляться QPushButton, которые будут выравниваться QGridLayout.
как мне добавить QScrollArea, чтобы если кнопок будет много, можно было воспользоваться полосой прокрутки?


Название: Re: Как добавить QScrollArea
Отправлено: gil9red от Май 25, 2013, 13:50
Как то так :) Не проверял, но должно работать :)
Код:
QGridLayout *gridLayoutChoiceRegion = new QGridLayout();

QScrollArea *scrollArea = new QScrollArea();
scrollArea->setLayout(gridLayoutChoiceRegion);

QVBoxLayout *vBoxLayout = new QVBoxLayout();
vBoxLayout->addWidget(scrollArea);

QGroupBox *groupBoxChoiceRegion = new QGroupBox(dialog);
groupBoxChoiceRegion->setLayout(vBoxLayout);


Название: Re: Как добавить QScrollArea
Отправлено: thechicho от Май 25, 2013, 14:38
не разобрался. не могли бы вы у себя проверить появится или нет полоса прокрутки, при добавлении кнопок на виджет?
я не пойму как связать лэйауты, виджеты и QScrollArea ???


Название: Re: Как добавить QScrollArea
Отправлено: gil9red от Май 25, 2013, 16:11
Добавляйте на gridLayoutChoiceRegion кнопки и все :)


Название: Re: Как добавить QScrollArea
Отправлено: thechicho от Май 25, 2013, 16:27
падает. возможно, я неверно добавляю.
у вас работает такой способ?


Название: Re: Как добавить QScrollArea
Отправлено: gil9red от Май 25, 2013, 16:30
Киньте этот код в main.cpp ;)
Код:
    QWidget *widget = new QWidget();

    // Кнопки будут размещены Grid layout
    QGridLayout *gLayoutChoiceRegion = new QGridLayout();

    for(int i = 0; i < 10; i++)
        for(int j = 0; j < 10; j++)
            gLayoutChoiceRegion->addWidget(new QPushButton(QString("%1-%2")
                                                           .arg(i).arg(j)),
                                           i, j);
    
    // Располагаться будут на виджете
    QWidget *widgetChoiceRegion = new QWidget();
    widgetChoiceRegion->setLayout(gLayoutChoiceRegion);

    // Помещаем виджет с кнопками в скролл зону
    QScrollArea *scrollArea = new QScrollArea();
    scrollArea->setFrameShape(QFrame::NoFrame);
//    scrollArea->setWidgetResizable(true);
    scrollArea->setWidget(widgetChoiceRegion);

    
    // Для размещения скролл-зоны с кнопками на group box
    // нужно будет создать еще один компоновщик - компоновщик group box
    // поместим на нем скролл-зону
    QVBoxLayout *vBoxLayout = new QVBoxLayout();
    vBoxLayout->addWidget(scrollArea);

    QGroupBox *groupBoxChoiceRegion = new QGroupBox();
    groupBoxChoiceRegion->setTitle("Group Box");
    groupBoxChoiceRegion->setLayout(vBoxLayout);


    QVBoxLayout *vBoxLayoutMain = new QVBoxLayout();
    vBoxLayoutMain->addWidget(groupBoxChoiceRegion);

    widget->setLayout(vBoxLayoutMain);

    widget->show();


Название: Re: Как добавить QScrollArea
Отправлено: gil9red от Май 25, 2013, 16:31
Проще делать такое не самому руками, а через дизайнер :)

Для того чтобы scrollarea начала скроллить, нужно ей не компоновщик (layout) подавать, а виджет


Название: Re: Как добавить QScrollArea
Отправлено: thechicho от Май 25, 2013, 17:17
компоновщики - это вынос мозга.
у меня диалог создается, у него компоновщик QGridLayout.
так я добавляю QGroupBox
Код:
gridLayoutDialog->addWidget(groupBoxChoiceRegion, 0, 1, 2, 1);

когда я пытался добавить QScrollArea

и в слоте динамически добавлять кнопки

Код:
QGridLayout *gridLayoutChoiceRegion = dialog->findChild<QGridLayout *>("gridLayoutChoiceRegion");
gridLayoutChoiceRegion->addWidget(new QPushButton(city.region, groupBoxChoiceRegion), i - row, column);

прога падала.
возможно я неправильно добавил QScrollArea
возможно, мне не хватало
Код:
QWidget *widgetChoiceRegion = new QWidget();
widgetChoiceRegion->setLayout(gLayoutChoiceRegion);

спасибо за пример, посмотрю еще может заработает как и хотелось.
хотя я уже решил, что лучше для данной задачи будет использовать QStackedWidget.
выводить определенное количество кнопок, что не помещается выводить на другой странице QStackedWidget.
добавить кнопки назад, далее, с помощью которых просматривать регионы.
но тоже возникла трудность с добавлением кнопок на QStackedWidget.
не пойму как добавить допустим 30 кнопок на 1 страницу, следующие 30 на другую и тп.
тоже как-то через компоновщики это делается, наверное...
создавать как вы посоветовали
Код:
QWidget *widgetChoiceRegion = new QWidget();
на нем размещать нужное количество кнопок и уже его добавлять в QStackedWidget...
блин, почему все так запутано :o