Для того, чтобы вовнутрь QScrollArea добавить другой виджет нужно сделать примерно следующее:
// Заранее созданная в setupUi() scrollArea
QLabel *l1 = new QLabel("label1");
scrollArea->setWidget(l1);
Метод QScrollArea::setWidget устанавливает наш лейбл l1 в качестве дочернего для scrollArea.А что, если мы хотим добавить пару лейблов вместо одного.
Вот такой код уже работать правильно не будет - появится только последний лейбл:
QLabel *l1 = new QLabel("label1");
QLabel *l2 = new QLabel("label2");
scrollArea->setWidget(l1);
scrollArea->setWidget(l2);
Для того, чтобы получить два лейбла, нужно использовать слои:
QLabel *l1 = new QLabel("label1");
QLabel *l2 = new QLabel("label2");
QVBoxLayout *labelLayout= new QVBoxLayout(scrollArea);
labelLayout->addWidget(l1);
labelLayout->addWidget(l2);
Теперь лейблы будут размещены один под другим.Либо просто назначить лейблы дочерними по отношению к QScrollArea
QLabel *l1 = new QLabel(scrollArea);
QLabel *l2 = new QLabel(scrollArea);
l1->setText("label1");
l2->setText("label2");
Можно сделать еще и следующим образом:QLabel *l1 = new QLabel("label1");
QLabel *l2 = new QLabel("label2");
QLabel *l3 = new QLabel("label3");
QVBoxLayout *layout = new QVBoxLayout(scrollArea);
layout ->addWidget(l2);
layout ->addWidget(l3);
ui->scrollArea->setWidget(l1);
Получится 2 лейбла на слое и один не на слое.Раньше был такой баг - если написать
ui->scrollArea_2->setWidget(l1); QVBoxLayout *l = new QVBoxLayout(scrollArea); l->addWidget(l2); l->addWidget(l3);то два последних лейбла не отобразятся. Я использую версию Qt4.6, и здесь такого бага уже не наблюдается.
Интересно использование виджета, унаследованного от QScrollArea
Возможно у меня какие-то ошибки, но выяснил следующее...
Допустим имеем:
class RenderArea: public QScrollArea
{
.....
}
то для того, чтобы добавить лейблы надо написать примерно так:RenderArea::RenderArea(QWidget * pParent) :
QScrollArea(pParent)
{
QLabel *l1 = new QLabel(this);
QLabel *l2 = new QLabel(this);
l1->setText("label1");
l2->setText("label2");
..............
}
только надо еще разместить их аккуратно, чтобы не перекрывались.Размещение с помощью setWidget делается как и раньше:
QLabel *l1 = new QLabel("Hello");
this->setWidget(l1);
Либо через слой, если больше одного размещаемого виджетаQLabel *l1 = new QLabel();
QLabel *l2 = new QLabel();
l1->setText("label1");
l2->setText("label2");
QVBoxLayout *layout = new QVBoxLayout(this);
layout ->addWidget(l1);
layout ->addWidget(l2);
и все прекрасно работает.Очень было б интересно услышать замечания, особенно тех, кто сталкивался с подобным элементом управления и как решал поставленную задачу.