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
paintEvent von Widgets aus Designer abfangen
Das ist ja genau der Punkt. Ich möchte das "einzelne" Widget eben nichtZum einen gibts im Designer die Option 'Promote zu Custom Widget'
promoten, da ich dann eine neue Klasse erstellen muss.
Äh, ja, na klar - aber was heißt das konkret? Den EventFilter kannzum anderen gibt es den QObject::eventFilter
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.
paintEvent von Widgets aus Designer abfangen - so geht es
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.Hast du dir wenigstens das Beispiel zu QObject::eventFilter genauer angeschaut?
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);
}
}