2011-04-26 6 views
0

Je travaille sur une visionneuse/étiqueteuse d'images de base qui aura besoin d'une vue miniature pour sélectionner une image. Jusqu'à présent, j'ai utilisé un QDockWidget entourant un QScrollArea avec un QHBoxLayout pour contenir une série de QLabels, dont chacun a son ensemble QPixMap.Comment créer un aperçu des miniatures Qt redimensionnable?

Cela semble très inélégant, et il devient seulement plus laid de considérer comment je pourrais implémenter la mise à l'échelle automatique des vignettes lorsque le QDockWidget est redimensionné. Il est encore plus compliqué par le besoin supplémentaire de redimensionner les vignettes lorsque la barre de défilement apparaît et disparaît.

Il doit y avoir une meilleure façon de faire cela?

Répondre

1

J'ai rencontré un problème similaire lorsque j'essayais d'animer le redimensionnement d'un qlabel avec un qpixmap. La méthode que j'ai trouvé qui fonctionnait le mieux était d'utiliser un QWidget à la place et de ré-implémenter la fonction paintEvent. Ensuite, votre image QWidget sera automatiquement mise à l'échelle si elle est redimensionnée. Voici un exemple:

Dans mon cas, j'avais les variables privées dans un objet privé appelé 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); 
    } 

}

Questions connexes