2017-08-30 4 views
0

Arbeits Ich habe Probleme, ein Signal an einen Slot im folgenden Code zu verbinden:QT Connect Slot/Signal nicht

#include "myserver.h" 

MyServer::MyServer(QObject *parent) : 
    QTcpServer(parent) 
{ 
} 

void MyServer::StartServer() 
{ 
    if(listen(QHostAddress::Any, 45451)) 
    { 
     qDebug() << "Server: started"; 
     emit servComando("Server: started"); 
    } 
    else 
    { 
     qDebug() << "Server: not started!"; 
     emit servComando("Server: not started!"); 
    } 
} 

void MyServer::incomingConnection(int handle) 
{ 
    emit servComando("server: incoming connection, make a client..."); 

    // at the incoming connection, make a client 
    MyClient *client = new MyClient(this); 
    client->SetSocket(handle); 

    //clientes.append(client); 
    //clientes << client; 

    connect(client, SIGNAL(cliComando(const QString&)),this, SLOT(servProcesarComando(const QString&))); 

    // para probar 
    emit client->cliComando("prueba"); 

} 

void MyServer::servProcesarComando(const QString& texto) 
{ 
    emit servComando(texto); 
} 

Die emit client->cliComando("prueba"); funktioniert, aber die eigentliche "emittiert" nicht. Die Konsole zeigt keinen Verbindungsfehler an und die QDebug-Texte zeigen an, dass alles gut funktioniert. Originalcode von http://www.bogotobogo.com/cplusplus/sockets_server_client_QT.php

+0

Zeigen Sie uns Ihren Signalverarbeitungscode. – arrowd

+0

_Der emit-Client-> cliComando ("prueba"); works_ Woher weißt du das? Außerdem können Sie SIGNAL einfach mit SIGNAL verbinden: _connect (client, SIGNAL (cliComando (const QString &)), SIGNAL (servComando (const QString &))); _ – Xplatforms

+0

Auch _ "prueba" _ als Argument verwendet ist offensichtlich nicht _const QString & _ es hängt von den verwendeten Compilern und Qt-Switches ab Verwenden Sie _QStringLiteral ("pueba") _ und setzen Sie das SIGNAL/SLOT-Argument auf _const QString_, wenn Sie das Argument direkt in den Funktionskörper einfügen und nicht sicher, ob der instantated param im QMeta-Prozess noch verfügbar ist und den Wert – Xplatforms

Antwort

0

kopiert wurde, fand ich das Problem, das Senden Im ein Signal vor dem Anschließen:

client->SetSocket(handle); 

das Signal sendet, und Im Connecting nachdem es ... Jetzt ist es:

// at the incoming connection, make a client 
MyClient *client = new MyClient(this); 

connect(client, SIGNAL(cliComando(const QString&)),this, SLOT(servProcesarComando(const QString&))); 

client->SetSocket(handle); 

Und es funktioniert. Ich habe es nach dem Lesen der folgenden bemerkt:

13. Setzen Sie alle Verbindungsanweisungen vor Funktionen Anrufe, die ihre Signale auslösen können, um sicherzustellen, dass die Verbindungen hergestellt werden, bevor die Signale ausgelöst werden. Zum Beispiel:

_myObj = new MyClass(); 
connect(_myObj, SIGNAL(somethingHappend()), SLOT(doSomething())); 
_myObj->init(); 

nicht

_myObj = new MyClass(); 
_myObj->init(); 
connect(_myObj, SIGNAL(somethingHappend()), SLOT(doSomething())); 

Ich fand es bei https://samdutton.wordpress.com/2008/10/03/debugging-signals-and-slots-in-qt/

Wie auch immer, vielen Dank für Ihre Antworten!

Verwandte Themen