Gibt es eine Möglichkeit, drawText() dazu zu bringen, das umgrenzende Rechteck eines QPicture zu aktualisieren?

StackOverflow https://stackoverflow.com/questions/792521

  •  16-09-2019
  •  | 
  •  

Frage

Zeichnung auf a QPicture sollte sein umgrenzendes Rechteck aktualisieren.So was:

>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawRect(20,20,50,50)
>>> picture.boundingRect()
QRect(20,20,50,50)

Aber wenn ich Text darauf zeichne, wird das umgrenzende Rechteck nicht aktualisiert:

>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawText(10,10, "Hello, World!")
>>> picture.boundingRect()
QRect(0,0,0,0)

Offensichtlich wird das umgrenzende Rechteck dadurch nicht aktualisiert.

Gibt es eine Möglichkeit, den gezeichneten Text wiederzugeben, oder muss ich das manuell tun?(Nicht allzu schwer, aber ich hoffe, dass Qt mir hier helfen kann.)

War es hilfreich?

Lösung

Schauen Sie sich diese Überladungsmethoden an, bei denen Sie das Begrenzungsrechteck nach dem Textparameter angeben müssen (der sich offenbar vom Rechteck an der Position des ersten Arguments unterscheidet):

Zeichnet den angegebenen Text innerhalb der bereitgestelltes Rechteck gemäß dem spezifizierten Flags.Das boundingRect (wenn nicht null) wird auf what gesetzt, was die Umgebendes Rechteck sollte in Ordnung sein , um den gesamten Text einzuschließen.

QPainter.drawText (1), QPainter.drawText (2)

Aktualisieren:

Wenn Sie im Voraus ein Begrenzungsrechteck für die Methode drawText() generieren möchten, rufen Sie einfach die Methode BoundingRect() auf QPainter auf, die Folgendes bewirkt:

Gibt das umgebende Rechteck der Text, wie er beim Zeichnen angezeigt wird innerhalb des gegebenen Rechtecks mit dem spezifizierten Flags mit dem aktuellen set font();d.h. die Funktion sagt Ihnen wobei die Funktion drawText() draw, wenn die gleichen Argumente angegeben werden.

Wenn der Text nicht in die gegebenen Rechteck mit dem angegebenen -Flags zurück, gibt die Funktion die erforderliches Rechteck.

QPainter.boundingRect

Ich habe BoundingRect mit der QRectF-Ausgabe verlinkt, aber die Informationen gelten auch für die anderen Versionen.

Übergeben Sie also grundsätzlich das Ergebnis von QPainter.boundingRect() an den BoundingRect-Parameter der QPainter.drawText()-Methode (das zweite QRect-Argument).

Update 2:

Ich entschuldige mich vielmals dafür, dass ich so verdammt dämlich bin.Ich habe vergessen, dass drawText in PyQt anders funktioniert als in Qt.Das umgrenzende Rechteck wird von der Funktion drawText ZURÜCKGEGEBEN (nicht wie bei Qt übergeben) und außerdem müssen Sie Ausrichtungsflags angeben, bevor Sie ein umgrenzendes Rechteck zurückerhalten.(Ich habe sogar p.end() gemäß Aaron Digullas Kommentar eingefügt):

pic = Qt.QPicture()
p = QtGui.QPainter(pic)
brect = p.drawText(10,10,200,200, QtCore.Qt.AlignCenter, "blah")
p.end()
print brect
print pic.boundingRect()

Hier ist die Ausgabe:

PyQt4.QtCore.QRect(100, 103, 20, 14)

PyQt4.QtCore.QRect(0, 0, 0, 0)

Es scheint also, dass Sie das Begrenzungsrechteck selbst festlegen müssen, obwohl es Ihnen zumindest von der Ausgabe der Methode drawText() bei der Übergabe von Flags zurückgegeben wird.

Dies scheint kein ideales Verhalten zu sein, da Sie das Begrenzungsrechteck selbst festlegen müssten.Ich hoffe, jemand anderes hat die Antwort, nach der Sie suchen, aber ich vermute, dass Sie diesen Fehler vielleicht melden möchten.

Andere Tipps

Malerei ändert nicht die Größe von etwas in Qt. Der Hauptgrund ist dies:

  • Eine Komponente muss sich malen
  • Die Farbe löst eine Größe ändern
  • Die Resize löst Malerei -> Endlosschleife

So ist die Größe ändern während der Layout-Phase geschehen hat. Danach sollten die Grenzen nicht ändern.

Ihr Problem zu lösen, verwenden QFontMetric, um herauszufinden, wie groß Ihr Text während oder in der Nähe der Konstruktion des Bildes sein wird und es dann entsprechend ändern.

[EDIT] Hm ... versuchen Ende () aufrufen, bevor die Begrenzungs rect anfordert. Wenn das funktioniert, haben Sie einen Fehler (nicht sehen können, ein Grund, warum die begrenzende rect nicht existieren sollten, wie Sie Elemente hinzufügen ...) gefunden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top