Qt-Neuling sucht Hilfe bei Programmierung eines Clients

Alles rund um die Programmierung mit Qt
Antworten
Andi83
Beiträge: 5
Registriert: 13. Februar 2008 13:48
Wohnort: Fürth

Qt-Neuling sucht Hilfe bei Programmierung eines Clients

Beitrag 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.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag 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
Andi83
Beiträge: 5
Registriert: 13. Februar 2008 13:48
Wohnort: Fürth

Beitrag 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;
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Andi83
Beiträge: 5
Registriert: 13. Februar 2008 13:48
Wohnort: Fürth

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Andi83 hat geschrieben: Problem: Wie mach ich aus dem QString nen const char *? Ein einfacher typecast tuts hier nicht.
Doku lesen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Andi83
Beiträge: 5
Registriert: 13. Februar 2008 13:48
Wohnort: Fürth

Beitrag 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:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ok, du willst einen ascii-String - was liegt also näher einfach mal auf der Seite nach 'ascii' zu suchen??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Andi83
Beiträge: 5
Registriert: 13. Februar 2008 13:48
Wohnort: Fürth

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Antworten