2011-01-02 10 views
5

Ich habe eine Unterklasse von QLabel erstellt, die ich in einem QGraphicsView verwenden möchte. Es dient als beweglicher "Punkt", auf den man klicken und die Grafikansicht ziehen kann.Warum funktioniert das Setzen der Pixmap eines QLabels nicht?

Das Erstellen der benutzerdefinierten Klasse und deren Anzeige in der Grafikansicht war kein Problem. jedoch versucht, die benutzerdefinierte QLabel zu bekommen, um sich mit dem Bild zu malen, das ich will, geschieht nicht. Der Konstruktor für meine benutzerdefinierte QLabel Klasse ist wie folgt:

TrackerPoint::TrackerPoint(QWidget *parent) : 
    QLabel(parent) 
{ 
    this->setFixedSize(40, 40); 
    QPixmap pixmap(":/images/target.png"); 
    this->setPixmap(pixmap); 
    this->setMask(pixmap.mask()); 
} 

Ich habe sichergestellt, dass die Bilder-Verzeichnis im Arbeitsverzeichnis vorhanden ist, die die Anwendung von ausgeführt wird. Wenn er dies überhaupt ist, ist meine QRC-Datei wie folgt:

<RCC> 
<qresource prefix="/images"> 
<file>images/target.png</file> 
</qresource> 
</RCC> 

Ich habe versucht, für Tage mit diesem Problem fertig zu werden - irgendwelche Ideen, warum das Bild nicht wäre schön erscheinen. (? Hat es mit der Tatsache zu tun, dass ich eine Pixmap in dem Konstruktor der QLabel Einstellung)

+0

Vielleicht hast du 'paintEvent' von' QLabel' über 'TrackerPoint :: paintEvent' überschrieben? – ismail

+0

Die ctor Verwendung sollte in Ordnung sein. Obwohl Subclassing in den meisten Fällen nicht notwendig sein sollte. Haben Sie versucht, ein Label außerhalb der grafischen Szene zu erstellen? Haben Sie QGraphicsPixmapItem getestet? –

Antwort

6

Sie haben:

<qresource prefix="/images"> 
<file>images/target.png</file> 
</qresource> 

Ich denke, dass dies in einer doppelten images in dem Ergebnis Ressourcenpfad, dh :/images/images/target.png. Um das zu beheben, entfernen Sie entweder die prefix="/images" oder setzen Sie alias="target.png" in die file Marke.

Um es deutlicher zu machen, wo der Fehler ist, können Sie Ihren Code schreiben könnte, so dass es QPixmap::load verwendet, kann, da dies auf Fehler überprüft werden:

QPixmap pixmap; 
if (!pixmap.load(":/images/target.png")) { 
    qWarning("Failed to load images/target.png"); 
} 
this->setPixmap(pixmap); 

Oder Sie könnten weiter und QImageReader gehen sogar verwenden, wo geben Sie detaillierte Fehlermeldungen an.

+0

Vielen Dank! Das hat mein Problem gelöst. Tangential, wenn ich PNG-Transparenz in meinem QLabel verwenden möchte, gibt es etwas Besonderes, was ich tun muss? –

+0

Nein, Sie müssen nichts Besonderes tun außer das Qt PNG-Plugin. –