Forum: PC-Programmierung Klasse für gui in qt/ c++


von Lars (Gast)


Lesenswert?

Hallo,
ich habe eine Frage zu C++/Qt.
Ich erstelle mir gerade eine Gui mit Qt und C++ in VisualStudio.
Verstehe ich das richtig, dass die Gui das einzige Objekt dieses 
Projektes ist und es somit nur eine Klasse gibt? Also alle Elemente die 
ich in die Gui packe, kommen ja in diese Klasse.
Was wäre ein Beispiel, wo man mehrere Klassen für die Gui hat?


Lars

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo Lars,

man kann alles in eine Klasse packen. Ist aber nicht sinnvoll.
Besser ist eine Trennung in einzelne Zuständigkeiten.

Mehrere Klassen in GUI bekommst Du auf jeden Fall, sobald Du noch andere 
Dialoge benötigst.

BTW: wieso nicht QT Creator statt VS?

mfg

Olaf

von Rolf M. (rmagnus)


Lesenswert?

Lars schrieb:
> Hallo,
> ich habe eine Frage zu C++/Qt.
> Ich erstelle mir gerade eine Gui mit Qt und C++ in VisualStudio.
> Verstehe ich das richtig, dass die Gui das einzige Objekt dieses
> Projektes ist und es somit nur eine Klasse gibt?

Nein. In der Regel hat man viele Klassen für die GUI. Mit "die Gui" 
scheinst du das Hauptfenster zu meinen. Das fasst aber in der Regel nur 
noch die Funktionalitäten zusammen, die in den anderen Klassen definiert 
ist.

von Lars (Gast)


Lesenswert?

Rolf M. schrieb:
> Mit "die Gui"
> scheinst du das Hauptfenster zu meinen

Ja genau.

Rolf M. schrieb:
> Das fasst aber in der Regel nur
> noch die Funktionalitäten zusammen, die in den anderen Klassen definiert
> ist.

Ahso, dann fange ich das auch an sofort zu überarbeiten.
Wie würde man die Klassen am besten zusammenfassen?
Ich habe z.B. mehrere Tabs in meinem Hauptfenster und dort verschiedene 
Elemente drinn. Würde man dann jeden Tab in eine eigene Klase 
zusammenfassen oder z.B. jeden Button (aus allen Tabs) in eine eigene 
Klasse und andere Elemente (aus allen Tabs) ebenfalls in eine eigene 
Klasse?

Olaf B. schrieb:
> man kann alles in eine Klasse packen. Ist aber nicht sinnvoll.

Das wird nämlich ein bisschen unübersichtlich. Daher kam mir die Frage 
auf.

Olaf B. schrieb:
> BTW: wieso nicht QT Creator statt VS?

Keine Ahnung, wurde mir so gezeigt. Ist das Erste Projekt mit Qt

Lars

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Lars schrieb:
> Ich habe z.B. mehrere Tabs in meinem Hauptfenster und dort verschiedene
> Elemente drinn. Würde man dann jeden Tab in eine eigene Klase
> zusammenfassen oder z.B. jeden Button (aus allen Tabs) in eine eigene
> Klasse und andere Elemente (aus allen Tabs) ebenfalls in eine eigene
> Klasse?

Nein. Die Steuerelemente/das Layout innerhalb deines Hauptfensters/GUI 
bleiben in dieser Klasse.

Die Events, die bei Qt Aktionen auslösen ( Signal/Slot-Konzept ) - z.B. 
starte Motor ( Klasse Motor, Methode start(void) )- werden als eigene 
Klasse implementiert.

mfg

Olaf

: Bearbeitet durch User
von dulnik (Gast)


Lesenswert?

Olaf B. schrieb:
> Lars schrieb:
eiben in dieser Klasse.
>
> Die Events, die bei Qt Aktionen auslösen ( Signal/Slot-Konzept ) - z.B.
> starte Motor ( Klasse Motor, Methode start(void) )- werden als eigene
> Klasse implementiert.
>
> mfg
>
> Olaf

Da bringst du aber etwas durcheinander. Signal/Slot-Konzept ist an sich 
völlig unabhängig von Events. Klar, man kann bei bestimmten Events 
bestimmte Signale senden. Man kann das aber völlig ohne Events tun.

Auch sind Event Handler KEINE SLots. S QWidget zB.

Man implementiert eigene Events nur wenn es tatsächlich nötig ist. 
Innerhalb einer GUI ist das nur in seltensten Fällen notwendig.

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo dulnik,

dann lies bitte das: http://doc.qt.io/qt-5/signalsandslots.html

> For example, if a user clicks a Close button, we probably want the window's 
close() function to be called.

mfg

Olaf

von Rolf M. (rmagnus)


Lesenswert?

Olaf B. schrieb:
> Hallo dulnik,
>
> dann lies bitte das: http://doc.qt.io/qt-5/signalsandslots.html

Und du lies das:

http://doc.qt.io/qt-5/eventsandfilters.html

>> For example, if a user clicks a Close button, we probably want the
>> window's close() function to be called.

Das hat aber nur indirekt mit Events zu tun, da der Button auf 
Maus-Events horcht und darüber erkennt, dass er angeklickt wurde. Aber 
das war's dann auch.
Signale/Slots muss man sich eher wie Callback-Funktionen vorstellen.
Und genau wie dulnik geschrieben hat, ist die close()-Funktion in dem 
Beispiel kein Event-Handler.

von dulnik (Gast)


Lesenswert?

Olaf B. schrieb:
> Hallo dulnik,
>
> dann lies bitte das: http://doc.qt.io/qt-5/signalsandslots.html
>
>> For example, if a user clicks a Close button, we probably want the window's
> close() function to be called.
>
> mfg
>
> Olaf

Dafür brauche ich weder einen neuen Event  noch sonst etwas zu 
implemetieren. Es reicht das clicked() SIGNAL des Buttons mit dem 
close() SLOT des Fensters mit connect zu verbinden.

Wenn ich will, das beim Schliessen des Fensters etwas besonderes 
passiert dann reimplementiere ich die virtuelle Methode closeEvent() der 
Fenster-Klasse.

Definition einer eigenen Event Klasse, wie du behauptest, ist überhaupt 
nicht notwendig in solchen Fällen.

von dulnik (Gast)


Lesenswert?

Rolf M. schrieb:

> Signale/Slots muss man sich eher wie Callback-Funktionen vorstellen.

Ja, aber das gilt nur innerhalb des gleichen Threads. Wenn sich SIGNAL 
und SLOT in verschiedenen Threads befinden, dann wird der SIGNAL/SLOT 
Mechanismus über den Event Loop implementiert. 
http://doc.qt.io/qt-4.8/threads-qobject.html#signals-and-slots-across-threads

von Rolf M. (rmagnus)


Lesenswert?

dulnik schrieb:
> Rolf M. schrieb:
>
>> Signale/Slots muss man sich eher wie Callback-Funktionen vorstellen.
>
> Ja, aber das gilt nur innerhalb des gleichen Threads. Wenn sich SIGNAL
> und SLOT in verschiedenen Threads befinden, dann wird der SIGNAL/SLOT
> Mechanismus über den Event Loop implementiert.

Ja, bzw. allgemein bei "queued connection". Bei mehreren Threads kann 
die Funktion aus dem einen Thread heraus ja gar nicht im anderen Thread 
aufgerufen werden. Nachteil bei queued connection ist aber, dass alle 
Parameter über QDataStream serialisierbar sein müssen und das das alles 
umständlich über die Eventloop abgewickelt wird. Bei der direct 
connection ist es nur ein einfacher Aufruf einer Memberfunktion über 
einen Pointer.
Ich hab bisher nur direct connection benutzt, nutze aber Qt auch schon 
seit einer Zeit, in der es noch nichts anderes gab.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.