QGraphicsView et de défilement de l'image mise à l'échelle/recadrage
Je voudrais avoir une image de fond dans mon QGraphicsView qui est toujours mis à l'échelle (et tronquée si nécessaire) à la taille de la fenêtre d'affichage, sans les barres de défilement et sans faire défiler l'écran avec le clavier et la souris. L'exemple ci-dessous est ce que je fais de redimensionner et de recadrer une image dans la fenêtre d'affichage, mais je suis en utilisant des valeurs aléatoires pour les cultures qui sont sortis de l'éther. Je voudrais une solution logique?
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->resize(800, 427);
//MainWindow is 800x480, GraphicsView is 800x427. I want an image that
//is the size of the graphicsView.
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//the graphicsView still scrolls if the image is too large, but
//displays no scrollbars. I would like it not to scroll (I want to
//add a scrolling widget into the QGraphicsScene later, on top of
//the background image.)
QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg");
QPixmap sized = backgroundPixmap->scaled(
QSize(ui->graphicsView->width(),
ui->graphicsView->height()),
Qt::KeepAspectRatioByExpanding); //This scales the image too tall
QImage sizedImage = QImage(sized.toImage());
QImage sizedCroppedImage = QImage(sizedImage.copy(0,0,
(ui->graphicsView->width() - 1.5),
(ui->graphicsView->height() + 19)));
//so I try to crop using copy(), and I have to use these values
//and I am unsure why.
QGraphicsPixmapItem *sizedBackground = scene->addPixmap(
QPixmap::fromImage(sizedCroppedImage));
sizedBackground->setZValue(1);
ui->graphicsView->setScene(this->scene);
}
Je voudrais savoir un moyen de redimensionner et de recadrer une image à la taille de la QGraphicsView qui fonctionne même quand je redimensionner le QGraphicsView. Où sont les 1.5 et 19 en venir?
EDIT; j'ai également tenté d'utiliser setBackgroundBrush, mais j'ai un arrière-plan en mosaïque, même lors de l'utilisation de l'échelle/recadrée QImage/QPixmap.
EDIT; Ma solution a été de remplacer drawBackground() pour obtenir le résultat que je voulais, mais ce n'est toujours pas m'aider à apprendre comment la taille d'une image à la taille de la fenêtre d'un qgraphicsview. Toute les réponses seraient grandement appréciés.
void CustomGraphicsView::drawBackground( QPainter * painter, const QRectF & rect )
{
qDebug() << "background rect: " << rect << endl;
QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg");
QPixmap sized = backgroundPixmap->scaled(QSize(rect.width(), rect.height()), Qt::KeepAspectRatioByExpanding);
painter->drawPixmap(rect, sized, QRect(0.0, 0.0, sized.width(), sized.height()));
}
OriginalL'auteur user298725 | 2010-03-22
Vous devez vous connecter pour publier un commentaire.
Vous voulez
sceneRect
pas seulementwidth
etheight
. Pour la mise à l'échelle sur redimensionner vous souhaitez connecter un slot poursceneRectChanged
de sorte que vous pouvez redimensionner l'image à chaque fois que la scène change de taille.Ou vous pouvez obtenir un
QGraphicsView
avec un substituéeupdateSceneRect
que les changements de la taille de l'image, ou mieux encore, de substituerdrawBackground
.OriginalL'auteur Adam W
J'ai trouvé
ui->graphicsView->viewport()->size()
pour obtenir la fenêtre d'affichage est la taille. Ne fonctionne qu'à partir du widget est dessiné.OriginalL'auteur Jamie Love
La
QGraphicsView::fitInView
fait exactement cela. Selon la documentation, il est communément mis dans unresizeEvent
. À l'aide desceneRects
rend la scène s'insérer dans la vue:OriginalL'auteur richelbilderbeek