Как создать предварительный просмотр миниатюр Qt с возможностью изменения размера?

#c #qt #qt4 #thumbnails #preview

#c #qt #qt4 #миниатюры #Предварительный просмотр

Вопрос:

Я работаю над базовым средством просмотра изображений / теггером, которому для выбора изображения потребуется просмотр миниатюр. До сих пор я использовал QDockWidget, заключающий QScrollArea в QHBoxLayout, чтобы содержать серию QLabels, каждая из которых имеет свой набор QPixmap.

Это кажется очень неэлегантным, и становится только уродливее, если подумать о том, как я мог бы реализовать автоматическое масштабирование миниатюр при изменении размера QDockWidget. Это еще более усложняется дополнительной необходимостью изменять размер миниатюр, когда появляется и исчезает полоса прокрутки.

Должен быть лучший способ сделать это?

Ответ №1:

Я столкнулся с аналогичной проблемой при попытке анимировать изменение размера qlabel с помощью qpixmap. Метод, который, как я обнаружил, работал лучше всего, заключался в использовании вместо этого QWidget и повторной реализации функции paintEvent. Затем ваше изображение QWidget будет автоматически масштабироваться, если его изменить. Вот пример:

В моем случае у меня были частные переменные в частном объекте под названием 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 );
    }
  

}