How to set an initial size of a QScrollArea?

16,458

Solution 1

I think that you are looking at the problem the wrong way. The QScrollArea is just a widget that you put in a frame or QMainWindow. The size of the widget is controlled by the layout of the widget that contains it.

Take a look at this example from Trolltech: Image Viewer Example

Solution 2

Is the scroll area the top level widget? If so, simply call

area->resize(300,300);

If it's inside a hierarchy you need to resize the toplevel appropriately (complex), or set the minimumSize of the area. You could also try to experiment with the LayoutPolicy - assuming the sizeHint is QSize(300,300) you can give it the appropriate size policy according to what's defined in https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

Solution 3

You can try:

class MyScrollArea : public QScrollArea
{
    virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};

// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );

However layout and Qt is amazingly Voodoo. It is IMO its least functional part.

if that doesn't work, try calling QWidget::resize() on various widgets.

Share:
16,458
Thomas Koschel
Author by

Thomas Koschel

Quite good in C++, beginner in Java

Updated on June 04, 2022

Comments

  • Thomas Koschel
    Thomas Koschel almost 2 years

    I know that this is a very specific C++ and Qt related question, but maybe someone can help me, anyway ...

    See the code below: I want to display an image within a scroll area. The view port of the scroll area shall have a defined initial size. That means, if the image's size is bigger than the initial size of the view port, scroll bars will be visible, otherwise not.

    // create label for displaying an image
    QImage image( ":/test.png" );
    QLabel *label = new QLabel( this );
    label->setPixmap( image.toPixmap() );
    
    // put label into scroll area
    QScollArea *area = new QScrollArea( this );
    area->setWidget( label );
    
    // set the initial size of the view port
    // NOTE: This is what I'd like to do, but this method does not exist :(
    area->setViewPortSize( QSize( 300, 300 ) );
    

    It shall be possible to resize the whole application so that the view port will get another size than the initial one.

    Unfortunatelly I was not able to find out, how to set the size of the view port. Qt's layout mechanism seems to set a default size for the view port, but up to now I was not able to change it. Setting a new size with

    area->setMinimumSize( QSize( 300, 300 ) );
    

    will actually set the demanded size, but then the scroll area looses the ability to get resized to a size smaller than 300x300.

    Any ideas?