Hallo,
ich habe ein Dialogfenster (MeinDialog(QtGui.QDialog, Dlg)) und in diesem ein Widget (widgetGrafik) in das ich z.B. ein Rechteck (drawRect) zeichnen möchte per paintEvent.
Wie bringe ich drawRect dazu, dass der Koordinatenursprung im Widget liegt und nicht im Dialog?
Grüße
Frank
PyQt: Widget im Dialog adressieren
Du musst eben in das Widget zeichnen und nicht in den Dialog. Du hast doch jetzt hoffentlich keine ausführlichere Antwort erwartet?

Na, das ist mir schon klar.
Mein paintEvent sieht erst einmal so aus:
Code: Alles auswählen
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.setPen(self.pen)
painter.setBrush(self.brush)
painter.drawRect(10,10,20,20)
Dann habe ich mein widgetGrafik, das vorher hier gebaut wird:
Code: Alles auswählen
class MeinDialog(QtGui.QDialog, Dlg):
def __init__(self):
QtGui.QDialog.__init__(self)
self.setupUi(self)
Code: Alles auswählen
self.widgetGrafik = QtGui.QWidget(Hauptdialog)
self.widgetGrafik.setGeometry(QtCore.QRect(10, 360, 441, 191))
self.widgetGrafik.setObjectName("widgetGrafik")
Code: Alles auswählen
def paintEvent(self.widgetGrafik, event):

Du musst dein QWidget mit einem Exemplar einer von QWidget abgeleiteten Klasse ersetzen, und in dieser Klasse dann paintEvent überschreiben. Man kann nicht von "außerhalb" in Widgets zeichnen, zumindest nicht plattformübergreifend.
Das bekomme ich hin, wenn ich das Widget nicht mit dem QtDesigner erzeuge.
Sollte man denn ggf. nur das Layout bauen und dann im Programm das Widget in das Layout fügen? Macht das Sinn? Zumindest habe ich das schon in zwei Beispielen gesehen...
Grüße
Frank
Sollte man denn ggf. nur das Layout bauen und dann im Programm das Widget in das Layout fügen? Macht das Sinn? Zumindest habe ich das schon in zwei Beispielen gesehen...
Grüße
Frank
Ich wüsste nicht, wo das Problem sein soll. Du schreibst die Klasse halt mit in die Datei, die sich um deine Gui kümmert. Falls du das Widget auch in anderen Projekten benötigst, könntest du ja ein Modul ``customized_widgets`` (oder so ähnlich) erstellen, wo dann die Klassen deiner angepassten Widgets definiert sind.
Da schaffe ich inzwischen schon. Mein Problem liegt darin, dass ich mit dem Designer ein leeres Widget erzeuge, in das ich zeichnen möchte und jetzt nicht sagen kann, wie ich das richtig einbinde.
Der Designer erzeugt ja sowas:
Im setupUi wird dann u.a. auch mein leeres Widget definiert.
Wenn ich das ohne den Designer erzeugen würde, hätte ich mein Layout und definiere vorher sowas:
und lege das Widget in das Layout.
Aber über den das setpUi kann ich nicht sagen, wie ich dran komme um das paintEvent zu erzeugen.
Tja, das sind wohl Anfängerprobleme...
Der Designer erzeugt ja sowas:
Code: Alles auswählen
class Ui_Hauptdialog(object):
def setupUi(self, Hauptdialog):
Wenn ich das ohne den Designer erzeugen würde, hätte ich mein Layout und definiere vorher sowas:
Code: Alles auswählen
class MeinWidget(QtGui.QDialog):
def __init__(self,parent):
QtGui.QLabel.__init__(self, parent)
self.parent = parent
def paintEvent(self, event):
print "Widget!"
Aber über den das setpUi kann ich nicht sagen, wie ich dran komme um das paintEvent zu erzeugen.
Tja, das sind wohl Anfängerprobleme...

Du kannst das z.B. über benutzerdefinierte Klassen im QDesigner erreichen (es muß ja nicht gleich ein Modul für den Designer sein).
So gehts:
- Angepaßte Klasse schreiben z.B. CustomPaintWidget(QWidget) in custompaintwidget.py
- Im Designer alles fertig layouten mit der Basisklasse Deines CustomPaintWidgets.
- Rechtsklick auf Dein Hauptwidget --> Benutzerdefinierte Klassen
- Im Dialog die Basisklasse und den Klassennamen setzen, also QWidget und CustomPaintWidget; unter include-Datei darf für Python nur der Modulname erscheinen, hier custompaintwidget
- Zum Schluß Rechtsklick auf das "Platzhalterwidget" --> Als Platzhalter für ben. Klasse --> CustomPaintWidget
Der uic-Loader kann das richtig auflösen, wobei er manchmal Probleme macht, wenn die CustomKlasse in der selben Datei ist wie die MainKlasse (zirkulärer Import etc.)
Grüße Jerch
Addendum:
Solltest Du ein komplexeres Design in Deiner CustomKlasse brauchen, geht das auch wieder über ui-files. Mit diesem "Schachtelprinzip" (Matroschka) kannst Du Dir quasi Deinen eigenen Widgetbaukasten erstellen.
Was ich noch vergessen habe: Du kannst dieses CustomWidget auch in die linke Seitenleiste zu den anderen Widgets ziehen, es erscheint dann unter "Ablage".
So gehts:
- Angepaßte Klasse schreiben z.B. CustomPaintWidget(QWidget) in custompaintwidget.py
- Im Designer alles fertig layouten mit der Basisklasse Deines CustomPaintWidgets.
- Rechtsklick auf Dein Hauptwidget --> Benutzerdefinierte Klassen
- Im Dialog die Basisklasse und den Klassennamen setzen, also QWidget und CustomPaintWidget; unter include-Datei darf für Python nur der Modulname erscheinen, hier custompaintwidget
- Zum Schluß Rechtsklick auf das "Platzhalterwidget" --> Als Platzhalter für ben. Klasse --> CustomPaintWidget
Der uic-Loader kann das richtig auflösen, wobei er manchmal Probleme macht, wenn die CustomKlasse in der selben Datei ist wie die MainKlasse (zirkulärer Import etc.)
Grüße Jerch
Addendum:
Solltest Du ein komplexeres Design in Deiner CustomKlasse brauchen, geht das auch wieder über ui-files. Mit diesem "Schachtelprinzip" (Matroschka) kannst Du Dir quasi Deinen eigenen Widgetbaukasten erstellen.
Was ich noch vergessen habe: Du kannst dieses CustomWidget auch in die linke Seitenleiste zu den anderen Widgets ziehen, es erscheint dann unter "Ablage".