Paint-Event im event-filter aufrufen

Alles rund um die Programmierung mit Qt
Antworten
graythornWW
Beiträge: 38
Registriert: 20. Oktober 2008 09:48

Paint-Event im event-filter aufrufen

Beitrag von graythornWW »

Hallo zusammen,

Ich fange den paint-event Eines QFrame-Widgets in einem event-filter ab.
Nun muß ich im event-filter die Zeichenfunktionalität der Basisklasse aufrufen, also folgender Code:

Code: Alles auswählen

bool DlgPalette::eventFilter(QObject 	*_pObj,
							 QEvent		*_pEvent)
{
    if (_pEvent->type() == QEvent::Paint)
    {
    	if (_pObj == ui.m_pPaletteWidget)
    	{
			QPaintEvent *pPaintEvent = dynamic_cast<QPaintEvent *>(_pEvent);
			PaintPalette(pPaintEvent);
			return true;
    	}
    } // if (_pEvent->type() == QEvent::Paint)

    // not handled => default processing
    return QObject::eventFilter(_pObj, _pEvent);
} // DlgPalette::eventFilter

Code: Alles auswählen

void DlgPalette::PaintPalette(QPaintEvent *_pEvent)
{
   ...
   !! die die Zeichenfunktionalität der Basisklasse QFrame aufrufen !!!
   ...
   // eigene Zeichenelemente zeichnen
} // DlgPalette::PaintPalette
Wie kann ich das machen?

Einfach

Code: Alles auswählen

repaint()
aufrufen führt natürlich zu einer Rekursion und

Code: Alles auswählen

QObject::eventFilter(ui.m_pPaletteWidget, _pEvent);
funktioniert nicht. Es wird nichts (also nicht der Rahmen von QFrame)gezeichnet.

Vielen Dank
SamFredericks
Beiträge: 14
Registriert: 19. April 2011 12:44

Beitrag von SamFredericks »

QFrame wird innerhalb der QFrame::paintEvent() gezeichnet. Diese Funktion ist allerdings protected.

Ganz ehrlich vor so einer Problematik stand ich irgendwie noch nie.
Entweder du leitest dein Objekt, welches sich hinter

Code: Alles auswählen

m_pPaletteWidget
befindet von QFrame ab, reimplementierst anschließend

Code: Alles auswählen

void MyFrameWidget::paintEvent(QPaintEvent*ev)
{
   if (ev)
   {
      QFrame::paintEvent(ev);
      //jetzt kann ich meinen eigenen Senf drüber malen...
   }
}
oder ja...k.A. QFrame::paintEvent(ev) ist halt protected und du kommst nur dran wenn du die Zugriffsrechte erbst.

Da du eine *.ui-Datei hast, gehe ich mal davon aus, dass du diese mit dem QTDesigner erstellt hast..??
Wenn ja, kannst du dort durch "promote to" oder eben "Als Platzhalter für benutzer...." deine Klasse angeben. (MyFrameWidget)

Ich hoffe ich konnte irgendwie helfen.... :wink:
graythornWW
Beiträge: 38
Registriert: 20. Oktober 2008 09:48

Beitrag von graythornWW »

SamFredericks hat geschrieben: Wenn ja, kannst du dort durch "promote to" oder eben "Als Platzhalter für benutzer....
Natürlich kenne ich dieses Verfahren, aber ich frage mich, ob es nicht eine etwas weniger aufwendige Lösung gibt.

Nur um ein Repaint zu implementieren, finde ich es recht aufwendig, eine neue Klasse zu erstellen und diese von - in meinem Fall - QFrame abzuleiten. Das bläht meines Erachtens nicht nur den Programcode unnötig auf, auch Dokumentationen z.B. werden unübersichtlich, da diese dann viele Klassen enthalten, die fast nichts machen, außer vielleicht eine andere Rahmenfarbe oder eine etwas anderes Button-Erscheinung etc. (Stichwort: Doxygen)

Provokativ gesagt, finde ich es an der Grenze eines Designfehlers der QT-Klassenbibliothek, wenn es nur über Ableitung geht. Immerhin gibt es ja auch noch den Event-Filter, der in diesem Falle ja auch einiges an seiner
Flexibilität verlieren würde!

ist natürlich nur meine bescheidene Meinung....
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Re: Paint-Event im event-filter aufrufen

Beitrag von padreigh »

graythornWW hat geschrieben:Hallo zusammen,

Ich fange den paint-event Eines QFrame-Widgets in einem event-filter ab.
Nun muß ich im event-filter die Zeichenfunktionalität der Basisklasse aufrufen, also folgender Code: [usw]
Du erzählst was du machst, das das nicht funktioniret hast du schon selbst gemerkt. Beschreib mal was du erreichen willst - eventuell wissen die Leute hier wie das -völlig ab von deinem Lösungsansatz- funktioniert.

hth
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

graythornWW hat geschrieben: Provokativ gesagt, finde ich es an der Grenze eines Designfehlers der QT-Klassenbibliothek, wenn es nur über Ableitung geht. Immerhin gibt es ja auch noch den Event-Filter, der in diesem Falle ja auch einiges an seiner
Flexibilität verlieren würde!
Der Entwurf eines Klassenframeworkes ist halt eine Gratwanderung zwischen "wir-zwingen-den-Anwender-zu-sauberem-OOP" und "einfache-Dinge-sollen-auch-einfach-erledigt-werden"..

Mit anderen Worten: die Trolls (und viele andere Entwickler, darunter ich) halten den Eventfilter für ein super Mittel um einfache Dinge (z.B. User-Inputs) einfach zu behandeln. Das Rendern jedoch überschreitet diese Grenze: Das Aussehen ist doch Sache des Widgets..! Was würde denn ein Widget überhaupt für einen Sinn machen, wenn das Rendern nicht zu seiner Aufgabe gehört?

graythornWW hat geschrieben:... die fast nichts machen, außer vielleicht eine andere Rahmenfarbe oder eine etwas anderes Button-Erscheinung etc. (Stichwort: Doxygen)
.
Es gibt noch andere Konzepte als Ableitungen.. eine Rahmenfarbe ist klar ein Attribut einer Klasse.. und keine weitere Ableitung.
Und eine andere Erscheinung oder mehrere "Child"-Elemente können ebenfalls mittels Aggregation gelöst werden:

Code: Alles auswählen

.....:paintEvent(...)
{
   myStyle->renderFrame();
   foreach(child, myChilds) {
     child->render();
   }
}
Also auch hier: keine Ableitung... nur eine saubere Software-Architektur.. und genau das versuchen die Trolls mit ihrem Framework zu bewirken. Zugegeben: manchmal mit Nachdruck :wink:

hth..
Antworten