mtbkrdave
mtbkrdave

Reputation: 3010

How to create a resizable Qt thumbnail preview?

I'm working on a basic image viewer/tagger that will need a thumbnail view to select an image. So far, I've used a QDockWidget enclosing a QScrollArea with a QHBoxLayout to contain a series of QLabels, each of which has its QPixMap set.

This seems very inelegant, and it only gets uglier to consider how I might implement auto-scaling of the thumbnails when the QDockWidget is resized. It's further complicated by the additional need to resize the thumbnails when the scroll bar appears and disappears.

There must be a better way to do this?

Upvotes: 1

Views: 1984

Answers (1)

rabid.sloth
rabid.sloth

Reputation: 111

I've ran into a similar problem when trying to animate resizing a qlabel with a qpixmap. The method I found that worked best was to use a QWidget instead and re-implement the paintEvent function. Then your QWidget image will automatically be scaled if it's resized. Here is an example:

In my case I had the private variables in a private object called private_:

bool image_set_;
QImage image_;
QBrush paintbrush_;

void MyClass::paintEvent( QPaintEvent* event )
{   
    // if the QWidget has an image set, then we use our custom painting.
    if( this->private_->image_set_ )
    {
        //I've made it so that my QWidget has a 1px white border
        this->private_->paintbrush_.setTextureImage( this->private_->image_.scaled(QSize( this->width() - 2, this->height() - 2 ) ) );
        QPainter painter( this );
        QRect temp_rect = QRect( 1, 1, this->width()-2, this->height() - 2 );
        painter.fillRect( this->rect(), Qt::white );
        painter.fillRect( temp_rect, this->private_->paintbrush_ );
    }
    else
    {
        QWidget::paintEvent( event );
    }

}

Upvotes: 2

Related Questions