#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 );
}
}