Qt-Neuling sucht Hilfe bei Programmierung eines Clients
Qt-Neuling sucht Hilfe bei Programmierung eines Clients
Hallo!
Ich beschäftige mich erst seit kurzem mit Qt und komme bei einem Projekt nicht weiter.
Folgendes habe ich vor:
Ich möchte eine Client-Anwendung schreiben, die einen Benutzer an einem Server authentifiziert und dann eine Liste, die der Server nach erfolgreichem Login schickt, tabellarisch darstellt.
Leider habe ich keinen Schimmer wie ich die Sache richtig angehen soll.
Folgende Dinge habe schon ausprobiert, aber jedesmal bin ich damit in der Sackgasse gelandet:
1.
- ein Login-Fenster und ein Fenster, dass die Tabelle anzeigt
- für beide Fenster existiert jeweils eine eigene Klasse, die von der QWidget-Klasse abgeleitet ist
- beide Fensterobjekte werden sofort nach Programmstart instanziert, es ist aber zunächst nur dass Login-Fenster sichtbar
- wird auf einen Login-Button geklickt und ist der Login erfolgreich, wird das Login-Fenster versteckt und das Tabellenfenster wird sichtbar
- es existiert noch eine dritte von QWidget abgeleitete Klasse, die die parent-Klasse für die beiden Fenster darstellt und als gemeinsame Schnittstelle dient
- außerdem wird in main() neben der eben beschriebenen Schnittstellenklasse noch eine Threadklasse instanziert, die dann die Kommunikation mit dem Server über sockets regelt
2. wie 1., jedoch wird die Threadklasse hier in der Schnittstellenklasse instanziert
3. wie 1., jedoch wird hier auf einen extra Thread für die Kommunikation verzichtet; diese läuft stattdessen innerhalb der Schnittstellenklasse ab
4.
- nur insgesamt 2 Klassen für Login und Tabelle
- Login-Objekt ist parent des Tabellen-Objekts
- Kommunikation innerhalb des Login-Objekts
Ich wollte jetzt eigentlich noch ne Möglichkeit mit QDialog- statt QWidget-Objekten probieren, aber bevor ich wieder ewig rumprobier und es kommt am Ende nur Blödsinn raus, dachte ich mir, hol ich lieber mal ne Expertenmeinung ein.
Also, im Klartext:
Kann mir irgendjemand sagen, welche der o.g. lösungsansätze vielleicht annähernd erfolgsversprechend klingt, bzw. wie ich die Aufgabenstellung am besten angehen sollte?
Bin für jeden Ratschlag dankbar.
Ich beschäftige mich erst seit kurzem mit Qt und komme bei einem Projekt nicht weiter.
Folgendes habe ich vor:
Ich möchte eine Client-Anwendung schreiben, die einen Benutzer an einem Server authentifiziert und dann eine Liste, die der Server nach erfolgreichem Login schickt, tabellarisch darstellt.
Leider habe ich keinen Schimmer wie ich die Sache richtig angehen soll.
Folgende Dinge habe schon ausprobiert, aber jedesmal bin ich damit in der Sackgasse gelandet:
1.
- ein Login-Fenster und ein Fenster, dass die Tabelle anzeigt
- für beide Fenster existiert jeweils eine eigene Klasse, die von der QWidget-Klasse abgeleitet ist
- beide Fensterobjekte werden sofort nach Programmstart instanziert, es ist aber zunächst nur dass Login-Fenster sichtbar
- wird auf einen Login-Button geklickt und ist der Login erfolgreich, wird das Login-Fenster versteckt und das Tabellenfenster wird sichtbar
- es existiert noch eine dritte von QWidget abgeleitete Klasse, die die parent-Klasse für die beiden Fenster darstellt und als gemeinsame Schnittstelle dient
- außerdem wird in main() neben der eben beschriebenen Schnittstellenklasse noch eine Threadklasse instanziert, die dann die Kommunikation mit dem Server über sockets regelt
2. wie 1., jedoch wird die Threadklasse hier in der Schnittstellenklasse instanziert
3. wie 1., jedoch wird hier auf einen extra Thread für die Kommunikation verzichtet; diese läuft stattdessen innerhalb der Schnittstellenklasse ab
4.
- nur insgesamt 2 Klassen für Login und Tabelle
- Login-Objekt ist parent des Tabellen-Objekts
- Kommunikation innerhalb des Login-Objekts
Ich wollte jetzt eigentlich noch ne Möglichkeit mit QDialog- statt QWidget-Objekten probieren, aber bevor ich wieder ewig rumprobier und es kommt am Ende nur Blödsinn raus, dachte ich mir, hol ich lieber mal ne Expertenmeinung ein.
Also, im Klartext:
Kann mir irgendjemand sagen, welche der o.g. lösungsansätze vielleicht annähernd erfolgsversprechend klingt, bzw. wie ich die Aufgabenstellung am besten angehen sollte?
Bin für jeden Ratschlag dankbar.
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
Danke für den Tipp. Ich habs jetzt mal so probiert, wie du vorgeschlagen hast. Scheint zu funktionieren. Allerdings hab ich noch ein Problem mit dem Senden des Logins. Es wird immer nur ein Zeichen an den Server geschickt. Ich hab schon alle möglichen string-Konversionen versucht, ohne Erfolg. Ne Idee?
Folgender Code:
void cLogin::doLogin()
{
btnLogin->setEnabled(false);
tcpSocket->abort();
tcpSocket->connectToHost("localhost", 12345);
QDataStream loginData(tcpSocket);
loginData.setVersion(QDataStream::Qt_4_0);
loginData << this->getLogin();
}
QString cLogin::getLogin()
{
QString strLogin;
strLogin.append(edtUser->text());
strLogin.append(" ");
strLogin.append(edtPassword->text());
return strLogin;
}
Folgender Code:
void cLogin::doLogin()
{
btnLogin->setEnabled(false);
tcpSocket->abort();
tcpSocket->connectToHost("localhost", 12345);
QDataStream loginData(tcpSocket);
loginData.setVersion(QDataStream::Qt_4_0);
loginData << this->getLogin();
}
QString cLogin::getLogin()
{
QString strLogin;
strLogin.append(edtUser->text());
strLogin.append(" ");
strLogin.append(edtPassword->text());
return strLogin;
}
Hattest Recht, liegt am Server. Sowohl bei Wireshark als auch mit netcat wird der ganze string übertragen.
Wenn ich jetzt statt << oder writeBytes() writeRawData(const char *, int) verwende, sollte der Client ja nur die reinen Daten ohne zusätzliche Infos übertragen, wenn ich die Doku richtig verstanden habe.
Problem: Wie mach ich aus dem QString nen const char *? Ein einfacher typecast tuts hier nicht.
Mal grundsätzlich gefragt: Welchen Vorteil hab ich, wenn der Datentyp bzw. die Länge vor den Nutzdaten mitgeschickt wird, wie es << macht?
Wenn ich jetzt statt << oder writeBytes() writeRawData(const char *, int) verwende, sollte der Client ja nur die reinen Daten ohne zusätzliche Infos übertragen, wenn ich die Doku richtig verstanden habe.
Problem: Wie mach ich aus dem QString nen const char *? Ein einfacher typecast tuts hier nicht.
Mal grundsätzlich gefragt: Welchen Vorteil hab ich, wenn der Datentyp bzw. die Länge vor den Nutzdaten mitgeschickt wird, wie es << macht?
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Doku lesenAndi83 hat geschrieben: Problem: Wie mach ich aus dem QString nen const char *? Ein einfacher typecast tuts hier nicht.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: