paintEvent von Widgets aus Designer abfangen

Alles rund um die Programmierung mit Qt
Antworten
iphenion
Beiträge: 17
Registriert: 4. Januar 2008 15:40
Wohnort: Wetter
Kontaktdaten:

paintEvent von Widgets aus Designer abfangen

Beitrag von iphenion »

Hallo zusammen,

ich würde gerne die paintEvent() Methode eines (bestimmten) Widgets, das im Designer erstellt wurde neu implementieren. Der normale Weg über Subclassing und Reimplementierung ist also nicht möglich.
Ich habe also nur den Pointer auf das Widget.

Kennt jemand einen Weg, wie ich trotzdem den Paint Event auf eine eigene Routine verbiegen kann?

Gruß, Peter
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Zum einen gibts im Designer die Option 'Promote zu Custom Widget' und zum anderen gibt es den QObject::eventFilter
iphenion
Beiträge: 17
Registriert: 4. Januar 2008 15:40
Wohnort: Wetter
Kontaktdaten:

Beitrag von iphenion »

Zum einen gibts im Designer die Option 'Promote zu Custom Widget'
Das ist ja genau der Punkt. Ich möchte das "einzelne" Widget eben nicht
promoten, da ich dann eine neue Klasse erstellen muss.
zum anderen gibt es den QObject::eventFilter
Äh, ja, na klar - aber was heißt das konkret? Den EventFilter kann
ich doch auch nur in einer neuen Klasse implementieren.

Im Grunde möchte ich "nur" in mehreren Widgets zeichnen, die aber auf gemeinsame Daten angewiesen sind und deshalb auch in einer Klasse stecken. Ich könnte das ganze per Hand zusammenbauen, möchte mir aber die Vorteile der späteren Layoutänderung im Designer erhalten.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Hast du dir wenigstens das Beispiel zu QObject::eventFilter genauer angeschaut?
iphenion
Beiträge: 17
Registriert: 4. Januar 2008 15:40
Wohnort: Wetter
Kontaktdaten:

paintEvent von Widgets aus Designer abfangen - so geht es

Beitrag von iphenion »

Hast du dir wenigstens das Beispiel zu QObject::eventFilter genauer angeschaut?
Was heißt hier "wenigstens"? Du musst nicht glauben, dass ich sofort weine und um Hilfe schreie, wenn was nicht klappt. Mir ist die Trolltech Doku schon bekannt.
Nichtsdestotrotz war mir dieser Ansatz nicht als Lösungsweg aufgefallen.
Und jetzt das gute: Es funktioniert auf diesem Weg. Ich danke Dir für Deinen Denkanstoß.
Ich hänge mal meine "Custom Widget Klassen Definition" an, für jeden, den das auch interessiert. Man kann da glaube ich ganz gut sehen, wie
der paintEvent für die Hauptklasse (Monitor) als Reimplementierung gelöst wurde und zusätzlich der paintEvent für ein spezielles Widget der Klasse Monitor (hier plotWid) abgefangen wurde.

Danke nochmal, Gruß, Peter

Code: Alles auswählen

#include "monitor.h"
#include "quickfunction.h"

Monitor::Monitor(QWidget *parent) : QWidget(parent) {
	startsample = 0;
	setupUi(this);
	plotWid->installEventFilter(this);
}

Monitor::~Monitor() {
}

void Monitor::paintEvent ( QPaintEvent * event ) {	
	QSize size = this->size();
	int xs = size.rwidth();
	int ys = size.rheight();
	
	QPainter paint(this);
	paint.setPen ( Qt::black );
	paint.setFont ( QFont ( "Arial", 30 ) );
	paint.fillRect ( rect(),QBrush ( Qt::blue ) );
	if (allsamples >= samplerange) {
		mw->gfxScroll->setMaximum(allsamples-samplerange);
		mw->gfxScroll->setPageStep(samplerange);
	}
}

bool Monitor::eventFilter(QObject *obj, QEvent *event)
{
	qDebug ("Event!");
	if (obj == plotWid) {
		qDebug ("Event! plotWid!");
		if (event->type() == QEvent::Paint) {
			qDebug ("Event Paint");
			// hier wird gemalt !!
			QPainter paint(plotWid);
			paint.fillRect ( rect(),QBrush ( Qt::green ) );
			// Event behandelt
			return true;
		} else {
			// Event nicht behandelt
			return false;
		}
	} else {
         	// den Event an Parent weitergeben
		return Monitor::eventFilter(obj, event);
	}
}

Antworten