Seite 1 von 1

paintEvent von Widgets aus Designer abfangen

Verfasst: 5. Januar 2008 12:42
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

Verfasst: 5. Januar 2008 12:56
von upsala
Zum einen gibts im Designer die Option 'Promote zu Custom Widget' und zum anderen gibt es den QObject::eventFilter

Verfasst: 5. Januar 2008 13:13
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.

Verfasst: 5. Januar 2008 15:24
von upsala
Hast du dir wenigstens das Beispiel zu QObject::eventFilter genauer angeschaut?

paintEvent von Widgets aus Designer abfangen - so geht es

Verfasst: 5. Januar 2008 18:43
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);
	}
}