2016-08-01 5 views
0

J'ai un QGraphicsView, en ce sens que j'ai un QGraphicsScene, en ce sens que j'ai un QLabel et que j'ai défini une image .png comme QPixmap dans le QLabel. Le fichier .png est défini dans le fichier de ressources background.qrc. La taille de mon QLabel est 600x400. Sans le pixmap c'est bon, la taille de QGraphicsScene est aussi de 600x400. Mais quand je mets le pixmap au QLabel et le redimensionne, il échoue. La taille de QLabel est la même, le pixmap est bien mis à l'échelle dans le QLabel et seulement visible à l'intérieur, mais QGraphicsScene adopte la taille réelle du QPixmap, qui est 720x720. Ainsi, le QLabel est visible avec la QPixmap dans sa taille correcte, mais il y a un endroit gris autour de lui, puisque la scène est plus grande. Comment puis-je résoudre ce problème et le faire fonctionner? Je veux que QGraphicScene reste sur la taille du QLabel.QT QGraphicsScene avec QLabel et QPixmap

Voici le code:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QPixmap> 
#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QLabel> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QGraphicsView *myView = new QGraphicsView(this); 
    QGraphicsScene *myScene= new QGraphicsScene(); 
    QLabel *myLabel= new QLabel(); 
    myLabel->setBaseSize(QSize(600, 400)); 
    myLabel->resize(myLabel->baseSize()); 
    myLabel->setScaledContents(true); 
    QPixmap pixmapBackground(":/new/cross.png"); 
    myLabel->setPixmap(pixmapBackground); 
    myScene->addWidget(myLabel); 
    myView->setScene(myScene); 
    setCentralWidget(myView); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
+1

Pourquoi n'utilisez-vous pas 'QGraphicsPixmapItem' à la place? Il est plus léger et facile à contrôler. – ilotXXI

+0

Ça ne marche pas pour moi. Je dois le faire avec un QLabel et un QPixmap. – Alex

+1

@Alex Et que voulez-vous dire par "ne pas travailler pour vous"? Peut-être que nous pouvons résoudre ce problème. – Tomas

Répondre

1

À partir de votre code d'exemple, vous ne définissez pas la taille de la scène. Vous pouvez le faire avec un appel au setSceneRect. Comme l'indique la documentation, lorsque le rect n'est pas réglé: -

Si unset, ou si elle est définie à une QRectF nulle, sceneRect() retourne le plus grand rect englobante de tous les éléments de la scène depuis la scène a été créée (c'est-à-dire, un rectangle qui se développe lorsque des éléments sont ajoutés ou déplacés dans la scène, mais ne rétrécit jamais).

Par conséquent, sans réglage de la rect scène, lorsque l'étiquette est ajoutée à la scène, sa taille est en train de changer, comme dans cet exemple

#include <QApplication> 
#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QLabel> 
#include <QPixmap> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QGraphicsView *myView = new QGraphicsView; 
    QGraphicsScene *myScene= new QGraphicsScene(); 

    // constrain the QGraphicsScene size 
    // without this, the defect as stated in the question is visible 
    myScene->setSceneRect(0,0,600,400); 

    QLabel *myLabel= new QLabel;  
    myLabel->setBaseSize(QSize(600, 400)); 
    myLabel->resize(myLabel->baseSize()); 
    myLabel->setScaledContents(true); 

    QPixmap pixmapBackground(720, 720); 
    pixmapBackground.fill(QColor(0, 255, 0)); // green pixmap 

    myLabel->setPixmap(pixmapBackground); 
    myScene->addWidget(myLabel); 
    myView->setScene(myScene); 
    myView->show(); 

    return a.exec(); 
} 

Cela devrait se traduire par la taille de la scène correcte, comme l'a démontré ici : -

enter image description here

comme il est indiqué dans les commentaires, le code exemple ci-dessus fonctionne comme prévu sur OS X, mais il semble toujours être un problème lors de l'exécution sur Windows 10.

+0

J'ai essayé ceci, juste avant d'ajouter le QPixmap: 0 myScene-> setSceneRect (0, 0, myLabel-> width(), myLabel-> height()); ' ;' Mais le résultat est le même. – Alex

+0

J'ai mis à jour la réponse avec un exemple. Comme vous pouvez le voir ici, si * setSceneRect * n'est pas appelé, l'effet que vous voyez est le même. – TheDarkKnight

+0

C'est exactement ce que j'essayais de faire, mais comme je l'ai dit, ça ne marche pas! [link] (https://postimg.org/image/lct8jh181/) Ceci est le résultat de votre code, copié et collé. Ca ne semble être bon que tant que je ne change pas la taille de la fenêtre ou l'échelle de la vue ... Ce que, bien sûr, je ferai, donc ce petit problème sera visible immédiatement. Mais merci de prendre le temps d'essayer de m'aider !! – Alex