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
(Anfänger) Tips für Widgetprogrammierung benötigt
-
Bang-Johansen
- Beiträge: 43
- Registriert: 11. Juli 2011 22:51
Re: (Anfänger) Tips für Widgetprogrammierung benötigt
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.
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.
-
Bang-Johansen
- Beiträge: 43
- Registriert: 11. Juli 2011 22:51
Re: (Anfänger) Tips für Widgetprogrammierung benötigt
Hallo,
das ist genau der Punkt, der mich beschäftigt.
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
das ist genau der Punkt, der mich beschäftigt.
Wenn man Bücher zu QT duchschmökert, da wird mit Klassen und Ableitungen regelrecht herumgeworfen, da weiß man jetzt nicht, ob das wirklichfranzf hat geschrieben:Zwanghaft jedes Fitzelchen in eine Klasse auszulagern, nur weil man "objektorientiert programmiert", kann ebenso schlechter Stil sein.
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
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).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.
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.
Jein. C++ ist eine Multi-Paradigmen-Sprache. Du bist nicht gezwungen, alles in Klassen zu stopfen. Du kannst auch mit freien Funktionen arbeiten.Also wenn es was größeres wird, dann sollte ich eine Klasse nehmen.
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.
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.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 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.
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.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 ?
Und nochmal ganz deutlich: Viele Wege führen zum Ziel, welchen du einschlägst liegt bei dir, deinen Ansichten, deinem Stil.