Seite 1 von 1

Qt-Neuling sucht Hilfe bei Programmierung eines Clients

Verfasst: 18. Februar 2008 13:46
von Andi83
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.

Verfasst: 18. Februar 2008 13:51
von PeterLustig
5.
- Für Login und Tabelle jeweils eine eigene Klasse, kein Elternteil vorhanden bei beiden
- Login erfolgreich -> Tabellenfenster erstellen und Loginfenster zerstören (lassen), Socketpointer übergeben und Elternelement ändern
- Der Socketkram braucht keinen extra Thread

Verfasst: 18. Februar 2008 17:29
von Andi83
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;
}

Verfasst: 18. Februar 2008 17:42
von upsala
Wer ist der Server? Ist eine eigene Anwendung? Was wird wirklich übers Netz übertragen? Hast du das z.B. mit Wireshark überprüft? Beachte, daß QDataStream nicht nur den String überträgt, sondern auch Informationen zum Datentyp, damit muß der Server auch klarkommen.

Verfasst: 18. Februar 2008 18:10
von Andi83
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?

Verfasst: 18. Februar 2008 18:24
von Christian81
Andi83 hat geschrieben: Problem: Wie mach ich aus dem QString nen const char *? Ein einfacher typecast tuts hier nicht.
Doku lesen

Verfasst: 18. Februar 2008 18:40
von Andi83
to Christian81:

Danke für den Tipp! Glaubst du, ich würd hier fragen, wenn ich da nicht schon ewig gesucht hätte? Falls du die Funktion kennst, hätte es genügt, sie einfach zu posten. Nix für ungut, aber so hilfst du mir mit deinem Rat herzlich wenig. :wink:

Verfasst: 18. Februar 2008 18:51
von Christian81
Ok, du willst einen ascii-String - was liegt also näher einfach mal auf der Seite nach 'ascii' zu suchen??

Verfasst: 18. Februar 2008 19:03
von Andi83
Christian81 hat geschrieben:Ok, du willst einen ascii-String - was liegt also näher einfach mal auf der Seite nach 'ascii' zu suchen??
Viel besser!

3 h in der Doku suchen, zig Funktionen ausprobieren -> kein Erfolg

im Forum fragen, nen einzeiligen Hinweis bekommen -> funzt!

Danke! :D

Verfasst: 18. Februar 2008 19:27
von upsala
Mal grundsätzlich gefragt: Welchen Vorteil hab ich, wenn der Datentyp bzw. die Länge vor den Nutzdaten mitgeschickt wird, wie es << macht?
Diese Frage solltest du dir selbst beantworten können.