Seite 1 von 1

(closed) Eigene Basis-Klasse von QT für Widgets erstellen

Verfasst: 10. November 2010 18:18
von Ritchie
Hallo Zusammen,

ich möchte eine Basis-Klasse erstellen, welche gewisse
Grundfunktionen, wie z.B. Slots, Clicks etc. enthalt, erstellen.

Diese muss ich entweder von QObject oder QWidget ableiten.

Wenn ich jedoch dann z.B. einen QPushButton + den Eigenschaften
meine Basis-Klasse haben will, wirds eng.
MyButton inherits from two QObject subclasses QObject and MyBaseObject. This is not supported!
Kann man das lösen ? Ich will schliesslich meine Grundfunktionen nicht in allen "QPushButton", etc. Klassen neu programmieren.

Gruss R.

Verfasst: 10. November 2010 18:44
von franzf
Man kann einfach in der Klassenhierarchie nur eine Elternklasse haben, die von QObject abgeleitet ist.
Kannst du mal bitte versuch zu beschreiben, was du erreichen willst? Dass es so nicht geht hast du ja jetzt gesehen.
Wenn es um Codezeilen/Duplizierung sparen geht: Vererbung ist nicht dazu gedacht, weniger tippen zu müssen!

Verfasst: 10. November 2010 18:47
von upsala
Wenn du erklären würdest, was du damit bezweckst, könnte man dir event. besser helfen. Ansonsten tuts wahrscheinlich schon der Event-Filter.

Verfasst: 10. November 2010 21:18
von Ritchie
Hi,

ich verwende derzeit verschiedene Objekte, wie QLabel, QDial, QLineEdit, etc.
Alle diese Objekte haben eine generelle Schnittstelle, mit denen ich die Objekte über eine XML Datei auf dem Bildschirm steuere.

Z.B. StatusVariable, Textvariable, Aktualisierungszeitraum, Position auf dem Bildschirm, Ausleseroutine zum Konfiguieren via XML Stream.

So eine Art "WinCC", falls das jemand kennt.

Diese Eigenschaften hat immer jedes Objekt. Das habe ich derzeit in jeder Klasse einzeln erstellt. Nur mit der Menge der Objekte wird der zu bearbeitende Code immer größer und Erweiterungen der generellen Schnittstelle sind sehr aufwendig.

Daher dachte ich, die generelle Schnittstelle als eine Art Basis-Klasse anzulegen und alle anderen Objekte sollen hieraus basieren.

Gruss R.

Verfasst: 10. November 2010 21:23
von Christian81
Und warum muss diese Basisklasse dann unbedingt von QObject erben?

Verfasst: 10. November 2010 21:24
von Ritchie
Brauche ich die nicht wegen einem Connect, Slots und Signals und so ?

Da ist auch ein Click(), DoubleClick() drin.

Verfasst: 10. November 2010 21:31
von Christian81
Ich kapier nicht was es soll - warum sollte man die Mouse-Events reimplementieren? Alle QWidgets haben doch da schon das was man braucht.

Verfasst: 10. November 2010 21:39
von Ritchie
Nun ja,

ich mache aus diesen Routinen generelle Routinen, welche eine JAVA Script Maschine aufrufen. Hierdurch kann ich das Verhalten der Buttons veraendern, ohne das ich eine Zeile C++ Code schreibe.

Das ganze läuft unter dem Namen "SCADA".
Siehe hier
http://de.wikipedia.org/wiki/Supervisor ... cquisition

Solche Bilder kann ich bereits mit meiner Software erstellen, ohne das man eine Zeile C Code schreibt.

Verfasst: 10. November 2010 21:40
von Christian81
Also quasi ein Language-Binding... naja wers braucht.
Da würde ich eher bei PyQt oder anderen Language-Bindings nachschauen wie es geht. Der Ansatz den Du verfolgst ist imho nicht sinnig.

Verfasst: 10. November 2010 21:50
von Ritchie
Na gut,

also alle QObject spec. Eigenschaft raus aus der Basis-Klasse und doch in jeder Klasse einzeln einfügen. Dann ist die Basisklasse nicht von QObject abgeleitet und es sollte gehen.

Gruss R.

Verfasst: 11. November 2010 20:28
von Ritchie
Hi,

jetzt bekomme ich zur Laufzeit
QGraphicsProxyWidget::setWidget: cannot embed widget 0xb6bf59d8 which is not a toplevel widget, and is not a child of an embedded widget
bei der Funktion
GraphicScene->addWidget(this)
Kann man das umgehen oder ist das jetzt eine Sackgasse ?

Hier die Klassen Def.
class MyButton : public QPushButton , public MyBaseObject
{
}
Gruss R.

Verfasst: 12. November 2010 08:11
von franzf
Etwas mehr Context bitte. Wie und wo wird das Widget erstellt? Warum schiebt es sich selbst in eine Scene?
Ansonsten wäre QtScript + Qt Script Generator einen Versuch wert.
Für eigene Werte gibt es das Property System.

Verfasst: 12. November 2010 12:49
von Ritchie
Hallo Franzf,

das Widget wird über eine seperate Klasse (screenload) in eine Fenster oder Dialog geladen, welche eine Konfigurationsdatei einliesst und anhand der entsprechenden Konfiguration entscheidet, welches Widget an welcher Position geladen wird.

Hierbei wird dem Widget selber die Konfigurationszeile mit übergeben (domelement), damit dieses sich die entsprechenden Infomationen aus der Zeile (Domelement) entnimmt.

Ich habe alle Funktionen und Konfiguration in das Widget gelegt, da nur dieses Objekt entscheidet, was es kann und was nicht. Alle Funktionen und Kunfigurationen sollen nur hier codiert sein, damit eine saubere Trennung der Funktionen vorhanden ist.

Aus diesem Grund schiebt es sich auch selber in die Scene. Es bekommt einen Pointer für die Position mitgeliefert. Einige Objekte müssen mit Additem eingetragen werden (lines,etc).

Derzeit habe ich für jedes Objekt eine seperate Klasse, abgeleitet von dem jeweiligen Ursprung z.B. "QPushButton" und dort meine zusätzlichen Funktionen eingefügt.

Da ich in fast allen Objekten die gleichen Grundfunktionen habe, dachte ich an eine Basis-Klasse für diese Funktionen und hätte diese an einer zentralen Stelle. Fehler und Erweiterungen müsste ich so nur einmal codieren.

Nur akzeptiert eine Scene ein solches Objekt wohl nicht. Daher meine Frage, ob es in den andere Möglichkeiten von C++ gibt eine solchen Funktion hinzubekommen.

Qt Script wird bereits von diesen Objekten verwendet, da innerhalb der Click-Routine der Benutzer selber entscheiden soll, was passiert.

Edit:
Wurde das ganze nicht mit einer virtuellen Vererbung gehen ?
http://de.wikibooks.org/wiki/Datei:Vererbung2.PNG
Schade, das löst immer noch nicht das Problem für die Scene (Toplevel)

Scheint in der Form wohl nicht zu gehen. Ich schliesse das Thema.

Gruss R.