Custom widget in QScrollArea



  • Hi,

    i create a widget in a QScrollArea that should fill the entire widget with red color, but when i scroll to the right, i see that it's not filled completely. The frame is drawn correctly. Here is my code:

    #include <QMainWindow>
    #include <QPainter>
    #include <QScrollArea>
    
    class MyWidget : public QWidget
    {
    public:
    
    	virtual void paintEvent(QPaintEvent* e)
    	{
    		QPainter painter(this);
    		painter.fillRect(geometry(), Qt::red);
    	}
    };
    
    class ScrollTest : public QMainWindow
    {
    	Q_OBJECT
    
    public:
    	ScrollTest(QWidget *parent = 0)	: QMainWindow(parent)
    	{
    		setGeometry(QRect(100,100,230,230));
    
    		MyWidget* widget = new MyWidget;
    		widget->setGeometry(QRect(0,0, 250, 250));
    		widget->setStyleSheet("border: 3px solid blue;");
    
    		QScrollArea* area = new QScrollArea(this);
    		area->setGeometry(QRect(0,0, 200, 200));
    		area->setWidget(widget);
    	}
    };
    

    Here is a Screenshot: image

    What's wrong?

    Edit raven-worx: added code tags


  • Moderators

    did you try QScrollArea::setWidgetResizable(true)?

    But the question is what you want to achieve, because actually a scrollarea's purpose is to show scrollbars if needed.

    If setWidgetResizable() doesn't do what you want you need to subclass QScrollArea and reimplement it's resizeEvent() handler and resize the widget manually.



  • This is just a simple test dialog that shows my problem. The real widget is an image viewer/editor. I tried QLabel to draw the image, but this is very slow when you zoom in with large images. What i want to do is to zoom and scroll through the image.

    If i call setWidgetResizable(true) i don't see the scrollbars and only a portion of the widget.



  • The solution is:

    painter.fillRect(QRect(0,0, width(), height()), Qt::red);
    

    geometry() delivers negative x/y values.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.