2016-08-01 15 views
0

Ich habe eine QGraphicsView, in der ich eine QGraphicsScene habe, in der ich ein QLabel habe und ich ein .png Bild als QPixmap in QLabel einstelle. Das .png wird in der Hintergrund.Qrc-Ressourcendatei festgelegt. Meine QLabel ist 600x400 groß. Ohne die Pixmap ist es okay, die Größe der QGraphicsScene ist auch 600x400. Aber wenn ich das Pixmap auf QLabel setze und es skaliere, schlägt es fehl. Die Größe von QLabel ist die gleiche, die Pixmap ist innerhalb von QLabel gut skaliert und nur innerhalb von QLabel sichtbar, aber QGraphicsScene nimmt die tatsächliche Größe der QPixmap an, also 720x720. Also ist das QLabel mit der richtigen Größe in der QPixmap sichtbar, aber da ist eine graue Stelle, da die Szene größer ist. Wie kann ich das beheben und es funktionieren lassen? Ich möchte, dass QGraphicScene auf der Größe von QLabel bleibt.QT QGraphicsScene mit QLabel und QPixmap

Hier ist der 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

Warum verwenden Sie nicht stattdessen 'QGraphicsPixmapItem'? Es ist leichter und einfacher zu steuern. – ilotXXI

+0

Es funktioniert nicht für mich. Ich muss es mit einem QLabel und einer QPixmap machen. – Alex

+1

@Alex Und was meinst du mit "nicht für dich arbeiten"? Vielleicht können wir dieses Problem lösen. – Tomas

Antwort

1

Von Ihrem Beispiel-Code, die Sie nicht die Größe der Szene. Sie können dies mit einem Anruf an setSceneRect tun. Da die Dokumentation wird, wenn der rect nicht gesetzt ist: -

Wenn nicht gesetzt, oder wenn auf einen Null-QRectF gesetzt, sceneRect() die größten Begrenzungs rect aller Elemente auf der Szene zurückkehren, da die Szene erstellt wurde (dh ein Rechteck, das wächst, wenn Elemente zu der Szene hinzugefügt oder in der Szene bewegt werden, aber niemals schrumpft).

daher ohne die Szene rect Einstellung, wenn das Etikett auf der Szene hinzugefügt wird, seine Größe verändert sich, wie in diesem Beispiel

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

Diese in der richtigen Szenengröße führen sollte, wie hier gezeigt, : -

enter image description here

wie in den Kommentaren diskutiert, arbeitet der Beispielcode, wie oben auf OS X erwartet, aber es scheint immer noch ein Problem zu sein, wenn die Ausführung auf Windows 10.

+0

Ich habe dies versucht, direkt vor dem Hinzufügen der QPixmap: 'myScene-> setSceneRect (0, 0, myLabel-> width(), myLabel-> height());' Aber das Ergebnis ist das gleiche. – Alex

+0

Ich habe die Antwort mit einem Beispiel aktualisiert. Wie Sie hier sehen können, wenn * setSceneRect * nicht aufgerufen wird, ist der Effekt, den Sie sehen, derselbe. – TheDarkKnight

+0

Genau das habe ich versucht, aber wie gesagt, es funktioniert nicht! [link] (https://postimg.org/image/lct8jh181/) Dies ist das Ergebnis Ihres Codes, kopiert und eingefügt. Es scheint nur gut zu sein, solange ich nicht die Fenstergröße oder die Ansichtsgröße verändere ... Was ich natürlich tun werde, damit dieses kleine Problem sofort sichtbar wird. Aber danke, dass du dir die Zeit genommen hast, mir zu helfen !! – Alex

Verwandte Themen