Seite 1 von 1

(Anfänger) Tips für Widgetprogrammierung benötigt

Verfasst: 4. Juni 2012 21:00
von Bang-Johansen
Hallo,

als ich arbeite mich so Stück für Stück in die QT Programmierung ein.

Dazu hätte ich eine relativ allgemeine Frage:
Ich schreibe gerade ein Programm, wo ein Menüaufruf ein weiteres Fenster öffnet.
Wie sollte diese Implementierung genau erfolgen ?
Zur Zeit habe ich ein Hauptfenster mit Menu,Werkzeugleiste u.s.w. (MainWindow)
Das Signal des Menüeintrages ist verbunden mit der Funktion weiter unten, die ein zusätzliches
Fenster öffnet:

void MainWindow::Test ()

{
qDebug () << "Jetzt sollte das Konfigurationsfenster für die Schnittstelle kommen";

PortConfigWidget = new QLabel ();
PortConfigWidget->setGeometry (50,50,400,600);
PortConfigWidget->show ();
}

Hier sollen später Einstellungen vorgenommen werden.
Dazu hätte ich einige Fragen :

- macht man das normalerweise so ? (Programmierstiel ?)
- sollte man das lieber über eine neue Klasse machen ?
- oder wie sonst ?

Danke an alle

Bang-Johansen

Re: (Anfänger) Tips für Widgetprogrammierung benötigt

Verfasst: 4. Juni 2012 21:24
von franzf
Generell ist das der Weg - QAction (hier in einem Menu) wird getriggert, ein Slot hängt dran und öffnet das Fenster.
Ob das neue Fenster jetzt eine eigene Klasse ist oder nicht hängt davon ab ob du wirklich was eigenes brauchst ;)
Wenn das QLabel reicht - warum nicht nehmen? Wenn es ausreicht, direkt in dem SLOT auf ein Pixmap zu rendern und das anzuzeigen - warum nicht?
Nur wenn der eine SLOT dann auf Dauer zu lange und unübersichtlich wird, würde ich auf eine eigene Klasse ausweichen.

Zwanghaft jedes Fitzelchen in eine Klasse auszulagern, nur weil man "objektorientiert programmiert", kann ebenso schlechter Stil sein.

Re: (Anfänger) Tips für Widgetprogrammierung benötigt

Verfasst: 4. Juni 2012 21:35
von Bang-Johansen
Hallo,

das ist genau der Punkt, der mich beschäftigt.
franzf hat geschrieben:Zwanghaft jedes Fitzelchen in eine Klasse auszulagern, nur weil man "objektorientiert programmiert", kann ebenso schlechter Stil sein.
Wenn man Bücher zu QT duchschmökert, da wird mit Klassen und Ableitungen regelrecht herumgeworfen, da weiß man jetzt nicht, ob das wirklich
so programmiert wird.

Also wenn es was größeres wird, dann sollte ich eine Klasse nehmen.
Dazu hätte ich allerdings wieder eine Frage:

Muß ich die neue Klasse dann von MainWindow ableiten ( class neue_Klasse : public MainWindow) ?
Wenn ja, warum ? Was gibt es denn zu vererben? (Entschuldigung für diese primitive Frage)

Außerdem ist mir aufgefallen, das ziemlich viel Code in eine einzelne Datei gesteckt wird.
Von C (Mikrocontrollerprogrammierung) bin ich es eigenlich gewohnt,wichtige Systemfunktionen in jeweils einer
eigenen .c und h. Datei zu haben.
Wie wird das unter C++ gehandhabt ?

Bang-Johansen

Re: (Anfänger) Tips für Widgetprogrammierung benötigt

Verfasst: 6. Juni 2012 10:19
von franzf
Bang-Johansen hat geschrieben:Wenn man Bücher zu QT duchschmökert, da wird mit Klassen und Ableitungen regelrecht herumgeworfen, da weiß man jetzt nicht, ob das wirklich
so programmiert wird.
Generell kann man machen was man will, wenn man weiß was man tut (und das begründen kann und sich im Rahmen der "Regeln" (-> C++ Standard) bewegt).
Wenn man beispielsweise ein Mixer-Frontend für alsa schreibt, hat man für alle möglichen Devices nen Regler. So ein Regler besteht aus nem QSlider, zwei QLabels (Beschriftung + Bild) und optional ner checkbox für mute, die alle in ein Layout gepackt werden. Bietet sich doch eine Klasse von QWidget abgeleitet an, oder? Man instantiiert dann im MainWindow so ein Control, legt es ins Layout und fertig.
Alternativ kann man sagen, dass aus C++-Sicht die Klasse unsinnig ist. Ableiten bedeutet Verhalten spezialisieren. In unserem Fall ist die einzige nötige Fuktion der Konstruktor, der die Elemente erzeugt und in ein Layout legt. Es werden vor allem auch keine protected-Funktionen der Basisklasse gebraucht, Zugriffe erfolgen nur über das public-Interface. Im Prinzip ist diese Klasse nur da, um Schreibarbeit zu sparen. Man könnte für das Erzeugen des Layouts genauso gut eine Funktion im MainWindow verwenden.
Also wenn es was größeres wird, dann sollte ich eine Klasse nehmen.
Jein. C++ ist eine Multi-Paradigmen-Sprache. Du bist nicht gezwungen, alles in Klassen zu stopfen. Du kannst auch mit freien Funktionen arbeiten.
Andere Sachen in Qt sind z.B. das Property-System oder "Meta-Object". Wenn du das verwenden willst, musst du von QObject (oder einer davon abgeleiteten Klasse wie QWidget) ableiten.
Muß ich die neue Klasse dann von MainWindow ableiten (class neue_Klasse : public MainWindow) ?
Wenn ja, warum ? Was gibt es denn zu vererben? (Entschuldigung für diese primitive Frage)
QMainWindow wenn du ein QMainWindow brauchst, sprich wenn du ganz einfach eine Menüleiste, DockWidgets, ToolBar, StatusBar, ... haben willst, ohne selber Verrenkungen unternehmen zu müssen.
QMainWindow selbst bietet jetzt keine eigenen virtuellen (protected) Funktionen an. In den meisten Ableitungen von QMainWindow wird nur dessen public-Interface verwendet (addToolBar, addDockWidget, setCentralWidget, ...). Theoretisch könnte man das Erstellen also auch in eine freie Funktion packen.
Außerdem ist mir aufgefallen, das ziemlich viel Code in eine einzelne Datei gesteckt wird.
Von C (Mikrocontrollerprogrammierung) bin ich es eigenlich gewohnt,wichtige Systemfunktionen in jeweils einer
eigenen .c und h. Datei zu haben.
Wie wird das unter C++ gehandhabt ?
Wenn du eine Klasse hast, die in mehreren Übersetzungseinheiten gebraucht wird, dann steck die Klassendefinition in eine eigene Header-Datei. Wenn du einen Klassenkomplex hast, in dem die einzelnen Klassen alleine wenig Sinn haben, dann pack doch alle in eine Header-Datei.

Und nochmal ganz deutlich: Viele Wege führen zum Ziel, welchen du einschlägst liegt bei dir, deinen Ansichten, deinem Stil.