Russian Qt Forum

Qt => Вопросы новичков => Тема начата: erinyes от Февраль 13, 2012, 22:10



Название: QScrollArea увеличивает свой размер при увеличении виджета
Отправлено: erinyes от Февраль 13, 2012, 22:10
Доброго времени суток, заранее извиняюсь за такой избитый вопрос.
На виджет scroll area по кнопке добавляются group box'ы. Поковырявшись, я вроде понял как это делается, но вопрос в следующем. Как мне ограничить scroll area по высоте? Виджет так и должен увеличиваться, как я понимаю, но с определенной высоты уходить в область прокрутки. На деле по мере нажатий - увеличивается, один groupbox уходит в прокрутку, потом scroll area тоже начинает увеличиваться. Пробовал:
setMaximumHeight() для scroll area - вообще не понял, scroll area уехало вниз, залезло на кнопку ???
sizeHint() переопределял в классе виджета, чтобы он больше некоторой высоту не возвращал. не работает
QSizePolicy для виджета игрался - не помогло

Код
C++ (Qt)
#include <QDialog>
#include <QGridLayout>
#include <QPushButton>
#include <QScrollArea>
#include <QMessageBox>
 
#include <testwidget.h>
 
class DialogTest : public QDialog
{
   Q_OBJECT
 
protected slots:
   void addBox();
public:
   explicit DialogTest(QWidget *parent = 0);
 
private:
   TestWidget *testWidget;
   QPushButton *pushButton;
   QScrollArea *scrollArea;
};
 
DialogTest::DialogTest(QWidget *parent) :
   QDialog(parent)
{
   pushButton = new QPushButton(this);
   scrollArea = new QScrollArea(this);
   QGridLayout *gridLayout = new QGridLayout(this);
   gridLayout->addWidget(scrollArea);
   gridLayout->addWidget(pushButton);
   testWidget = new TestWidget(this);
   testWidget->addBox();
   scrollArea->setWidget(testWidget);
 
   connect(pushButton, SIGNAL(clicked()),
           this, SLOT(addBox()));
   adjustSize();
}
 
void DialogTest::addBox()
{
   testWidget->addBox();
   scrollArea->setMinimumSize(testWidget->layout()->sizeHint());
 
}

Код
C++ (Qt)
#include <QWidget>
#include <QGroupBox>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QLabel>
#include <QComboBox>
#include <QPushButton>
 
class TestWidget : public QWidget
{
   Q_OBJECT
public:
   explicit TestWidget(QWidget *parent = 0);
   void addBox();
   virtual QSize sizeHint() const;
 
signals:
 
public slots:
 
private:
   QGroupBox* boxConstructor();
 
};
 
TestWidget::TestWidget(QWidget *parent) :
   QWidget(parent)
{
   QVBoxLayout *layout = new QVBoxLayout(this);
   layout->setSizeConstraint(QLayout::SetMinAndMaxSize);
   setLayout(layout);
}
 
QGroupBox* TestWidget::boxConstructor()
{
   QGroupBox *newBox = new  QGroupBox;
   QGridLayout *layout = new QGridLayout;
   layout->addWidget(new QLabel("Test"), 0, 0);
   layout->addWidget(new QLabel("Test"), 1, 0);
   layout->addWidget(new QLabel("Test"), 2, 0);
   QComboBox *combo1 = new QComboBox;
   QComboBox *combo2 = new QComboBox;
   QComboBox *combo3 = new QComboBox;
   QComboBox *combo4 = new QComboBox;
   layout->addWidget(combo1, 0, 1);
   layout->addWidget(combo2, 1, 1);
   layout->addWidget(combo3, 0, 2);
   layout->addWidget(combo4, 1, 2);
   layout->addWidget(new QPushButton("Test"), 2, 2);
   layout->setSizeConstraint(QLayout::SetMinAndMaxSize);
   newBox->setLayout(layout);
   return newBox;
}
 
void TestWidget::addBox()
{
   QGroupBox* box = boxConstructor();
   layout()->addWidget(box);
}
 
QSize TestWidget::sizeHint() const
{
   QSize size = QWidget::sizeHint();
   if (size.height() > 300 )
       size.setHeight(300);
   return size;
}
 


Название: Re: QScrollArea увеличивает свой размер при увеличении виджета
Отправлено: erinyes от Февраль 14, 2012, 18:23
В общем, проблема с утра решилась сразу же.
В приведенном коде убрать setMinimumSize, QScrollArea выставить QSizePolicy::Preffered по вертикали.
Был на 100% уверен, что этот вариант пробовал.