LINUX.ORG.RU

Как правильно отобразить QHBoxLayout в QScrollArea? (скрин и компилируемый пример прилагаю)

 


0

1

Мне нужно разместить QHBoxLayout в QScrollArea.

Это нужно для того, чтобы если QHBoxLayout будет слишком широкий, он просто уезжал за границу окна и не растягивал окно во всю ширину.

Я пользуюсь таким кодом:

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QScrollArea>
#include <QPalette>
#include <QSizePolicy>
#include <QString>
#include <QLabel>

int main(int argc, char *argv[])
{
 QApplication app(argc, argv);

 QWidget *recordTagsContainer;
 QHBoxLayout *recordTagsLayout;
 QScrollArea *recordTagsScrollArea;
 
 QLabel *label1=new QLabel("Label1");
 QLabel *label2=new QLabel("Label2");
 QLabel *label3=new QLabel("Label3");
 
 // Область текстовых меток, которые выглядят на экране как [метка1] [метка2] [метка3] ...
 recordTagsLayout=new QHBoxLayout();
 recordTagsLayout->setAlignment(Qt::AlignLeft);
 // !!! Место для добавления текстовых меток !!!
 
 // QHBoxLayout невозможно добавить в QScrollArea, поэтому оборачивается в виджет
 recordTagsContainer = new QWidget();
 recordTagsContainer->setBackgroundRole(QPalette::Dark);
 recordTagsContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
 recordTagsContainer->setLayout(recordTagsLayout);

 // Создается QScrollArea и в нее добавляется виджет с QHBoxLayout
 recordTagsScrollArea=new QScrollArea();
 recordTagsScrollArea->setWidget(recordTagsContainer);
 
 // Добавление текстовых меток 
 recordTagsLayout->addWidget(label1);
 recordTagsLayout->addWidget(label2);
 recordTagsLayout->addWidget(label3);

 recordTagsScrollArea->show();
 return app.exec();
}

В этом примере добавление текстовых меток происходит ближе к концу кода. И этот пример НЕ показывает текст «Label1 Label2 Label3»!

А если перенести добавление текстовых меток в область строки, обозначенную в коде как "!!! Место для добавления текстовых меток !!!" (то есть, сразу после создания QHBoxLayout), то все корректно отображается:

http://i.piccy.info/i9/d0296fc34b553ed2c76c95e7ec6ce81f/1417377690/13906/8259...

Но у меня программа должна сначала создавать интерфейс: основные виджеты, слои, области прокрутки. И только потом динамически добавлять/удалять эти самые текстовые метки.

Вопрос: как добавить текстовые метки в QHBoxLayout, размещенный в QScrollArea так, чтобы они были видны? Причем сделать это надо после размещения QHBoxLayout в QScrollArea.

★★★★★

просто образец для создания вопроса

 recordTagsLayout->addWidget(label3);

+ recordTagsContainer->adjustSize();

 recordTagsScrollArea->show();

anonymous
()
Ответ на: комментарий от anonymous

Да, сработало, спасибо.

Я подумывал копнуть adjustSize(), но меня остановило то, что в темно-сером квадратике (случай с добавлением текстовых меток внизу кода) не видно кусочка буквы L, хотя, по идее, он там должен быть виден.

Теперь хочу понять - почему этого кусочка не видно? Ведь он должен быть виден в квадратике.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

все там же убери adjustSize() и добавь:

 label1->setStyleSheet("background-color: rgb(255, 127, 127);");
 label2->setStyleSheet("background-color: rgb(127, 255, 127);");
 label3->setStyleSheet("background-color: rgb(127, 127, 255);");
 recordTagsLayout->setMargin(0);
 recordTagsLayout->setSpacing(0);

anonymous
()

Угадал автора по заголовку

Stil ★★★★★
()
Ответ на: комментарий от anonymous

Коль пошла такая пьянка, еще вопрос.

Сейчас объект recordTagsScrollArea выделяет под себя на экране много места. А нужно, чтобы выделялось место размером с содержимое - то есть, размером с recordTagsContainer.

Я добавил после создания объекта recordTagsScrollArea такую настройку:

recordTagsScrollArea->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

Но recordTagsScrollArea все равно занимает гораздо большую область чем recordTagsContainer.

Что еще надо крутануть, чтобы recordTagsScrollArea стало минимальным (стало размером с содержимое (хотя бы по высоте))?

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.