Anzeige:
Ergebnis 1 bis 7 von 7

Thema: QT3, Signals and Slots

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123

    QT3, Signals and Slots

    hi,

    mit nachfolgender klasse habe ich ein kleines problem. der konstruktor wird aufgerufen, die Verbindung wird auch aufgebaut und dann nur noch fragezeichen ....

    das projekt (linkpruefung):
    für das ganze exisitiert eine kleine graphische oberfläche. der benutzer drückt nach diversen einstellungen eine button. der verknüpfte slot ruft eine globale methode auf, die dann die eigentliche arbeit übernimmt. die klasse HttpClient soll die kommunikation mit dem webserver übernehmen.
    verbindung aufbauen und die Antwort als String zurückgeben.

    zuerst habe ich das ganze ohne signals versucht, ging natürlich nicht, also signals connected und debug-ausgaben hinzugefügt (cout << ""). nun mußte sich feststellen, dass nur das erste signal gesendet wird (hostFound()). die restlichen nicht. die syntax müßte stimmen, da ich ja das erste signal entgegennehmen kann. fehlermeldungen kommen keine.
    Code:
    HttpClient::HttpClient(QObject &w){
    	_socket = new QSocket();
    	connect( _socket, SIGNAL(hostFound()),SLOT(send_Socket()));
    	connect( _socket, SIGNAL(connected()),SLOT(send_Socket()));
    	connect( _socket, SIGNAL(bytesWritten( int )),SLOT(write_Socket(int)));
    	connect( _socket, SIGNAL(delayedCloseFinished()),SLOT(send_Socket()));
    }
    void HttpClient::conSocket(const QString &host, const QString & url , Q_UINT16 port ){
    	// String zuruecksetzen
    	_readSocket = "";
    	_url = url;
    	_host = host;
    	_status=FALSE;
    	_error = "x";
    	_send = "";
    	
    	// Verbindung herstellen
    	_socket->connectToHost( host, port );
    	// url an Socket schicken
    	/*QTextStream _sendToSocket (_socket);
    	
    	QTextOStream(&_send) << "GET " << _url << " HTTP/1.1\n"
    			<< "Host: " << _host << "\n"
    			<< "\n";	
    	cout << _send;
    	_sendToSocket << _send;
    */
    }
    und die klasse dazu:
    Code:
    class HttpClient: public QObject {
    	Q_OBJECT
    private:
    	QString 	_readSocket, _url, _host, _error, _send;
    	QSocket 	*_socket;
    	bool _status;
    	
    public:
    	HttpClient(QObject &w);
    	~HttpClient();
    	
    	void conSocket(const QString &host, const QString & url = (QString) "/", Q_UINT16 port = 80);
    	QString getString();
    	QSocket* getSocket(){
    		return _socket;
    	}
    	
    public slots:
    	void send_Socket();
    	void read_Socket();
    	void error_Socket(int);
    	void write_Socket(int);
    };
    wenn ich noch etwas nachreichen kann, dann sagt einfach bescheid. es wäre schön, wenn jemand den fehler finden würde ;-)

    gruesse reinhard

  2. #2
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    so,
    zwischenzeitlich habe ich noch ein paar kleine problemchen behoben, die mir doch ganz ordentlichen kummer gebracht haben.

    - der request an den server wurde überarbeitet: "\r\n"
    - header um den bereich "Connection" ergänzt
    - das ganze auch noch mal selbst geschrieben ....

    was mich jedoch immer noch zur verzweiflung bringt, sind die signals die ich hier connected habe. dem sender und dem empfänger habe ich zwischenzeitlich noch namen zugewiesen, die auch schön angezeigt werden, wenn ich bewußt einen slot angebe, der nicht existiert. die signals werden korrekt verbunden (rückgabe des befehls ist 1) und auch wieder gelöscht. dann habe ich noch den traffic mitgeschnitten. die server antworten auf den request, nur die signals werden nicht ausgelöst.
    weder connected, noch readyRead und schon gar nicht bytesWritten. nur das signal hostFound kommt an und kann verarbeitet werden. der trafficmitschnitt beweißt jedoch, dass die kommunikation läuft.

    kann mir noch jemand einen tip geben, wo ich hier ansetzen kann?

    gruesse
    Reinhard

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Kannst du mehr Code posten? Dann könnte ich nochmal schauen.

  4. #4
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    ich habe mal die beiden files angehängt ....

    ich habe allerdings noch ein wenig daran herumgespielt ...

    wenn du noch etwas entdeckst, was so nicht in Ordnung ist, dann sprich mich ruhig darauf an ;-). ich habe erst mit qt angefangen und mit c++ bin ich auch noch nicht viel länger zu gange ;-)

    gruesse

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Deine Probleme kann ich nicht nachvollziehen. Ich habe mit den beiden Dateien mal ein übersetzbares Programm gemacht, und aus deinen Dateien nur dieses "linkproj..." sonstwas-Include rausgenommen, sowie eine Ausgabe der gelesenen Daten eingebaut. Das funktioniert eigentlich. Ich habe meine Dateien mal angehängt.

    Ausgabe bei mir:
    11socket 0x80bdc90
    send
    read

    read data = HTTP/1.1 302 Found
    Location: http://www.google.de/index.html
    Set-Cookie: PREF=ID=125f1fa5ae733752:TM=1135975912:LM=11359759 12:S=6KQqKwfE2016IexC; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
    Content-Type: text/html
    Server: GWS/2.1
    Content-Length: 231
    Date: Fri, 30 Dec 2005 20:51:52 GMT

    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=us-ascii">
    <TITLE>302 Moved</TITLE></HEAD><BODY>
    <H1>302 Moved</H1>
    The document has moved
    <A HREF="http://www.google.de/index.html">here</A>.
    </BODY></HTML>
    Du solltest übrigens keine Namen, die mit Unterstrich+Großbuchstaben beginnen, als Include-Guards verwenden. Das verbietet C++.

  6. #6
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    Zitat Zitat von locus vivendi
    Deine Probleme kann ich nicht nachvollziehen. Ich habe mit den beiden Dateien mal ein übersetzbares Programm gemacht, und aus deinen Dateien nur dieses "linkproj..." sonstwas-Include rausgenommen, sowie eine Ausgabe der gelesenen Daten eingebaut. Das funktioniert eigentlich. Ich habe meine Dateien mal angehängt.

    Du solltest übrigens keine Namen, die mit Unterstrich+Großbuchstaben beginnen, als Include-Guards verwenden. Das verbietet C++.
    thanks, ich habe halt mal in die header-files reingeschaut und dann einfach genau so gemacht. aber ich werde das in zukunft berücksichtigen ;-).

    dass bei mir die signals nicht kommen wird dann wohl an der implementierung des ganzen liegen.

    ich erstelle eine gui mit dem designer, sowie die main, usw..
    in der gui ist ein button mit dem ich über den zugehörenden slot eine methode aufrufe, die dann die verbindung startet. von dort aus übergebe ich eine pointer an die methode, die den dann an die klasse httpclient übergibt ...
    etwas verworren, aber ich wußte nicht wie ich das sonst realisieren sollte ....
    hast du icq? dann könnten wir mal quatschen, warum, usw ...

    gruesse
    reinhard

  7. #7
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    so,

    dank vivendi ist das problem lokalisiert.

    nicht die klasse selbst ist das problem, sondern die implementierung in das projekt.

    das Objekt das ich erstelle wird einfach wieder gelöscht bevor die signals überhaupt abgesetzt werden können.

    grüsse und allen ein Gutes Neues Jahr

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •