Слот QT Connect / Сигнал не работает

У меня возникли проблемы с подключением сигнала к слоту в следующем коде:

#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);
}

emit client->cliComando("prueba"); работает, а настоящее "излучает" - нет. Консоль не показывает никаких ошибок подключения, а тексты QDebug показывают, что все работает хорошо. Исходный код был скопирован с http://www.bogotobogo.com/cplusplus/sockets_server_client_QT.php


person Juan Carlos Alvez Balbastro    schedule 30.08.2017    source источник
comment
Покажите нам свой код обработки сигнала.   -  person arrowd    schedule 30.08.2017
comment
Выпускной клиент-›cliComando(prueba); работает Откуда вы это знаете? Кроме того, вы можете просто подключить SIGNAL к SIGNAL: connect(client, SIGNAL(cliComando(const QString&)),this, SIGNAL(servComando(const QString&)));   -  person Xplatforms    schedule 30.08.2017
comment
Также prueba, используемый в качестве аргумента, не является явно const QString&, это зависит от компилятора и используемых переключателей Qt. Используйте QStringLiteral(prueba) и задайте для аргумента SIGNAL/SLOT значение const QString, если вы вставляете аргумент непосредственно в тело функции и не уверены, что экземпляр параметра в процессе QMeta все еще доступен и имеет стоимость   -  person Xplatforms    schedule 30.08.2017
comment
Мой волшебный шар говорит: отсутствует макрос Q_OBJECT в определении класса MyServer.   -  person Marek R    schedule 30.08.2017
comment
оффтоп: почему вы наследуете QTcpServer. Здесь следует использовать композицию.   -  person Marek R    schedule 30.08.2017
comment
В вашем фрагменте кода отсутствуют тестовые случаи. Вы должны предоставить полный минимальный воспроизводимый пример, если вы ожидаете полезных ответов.   -  person Murphy    schedule 30.08.2017


Ответы (1)


Я нашел проблему, я отправляю сигнал ДО подключения:

client->SetSocket(handle);

отправляет сигнал, и после него я ПОДКЛЮЧАЮСЬ... Теперь это:

// 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);

И это работает. Я заметил это после прочтения следующего:

13. Поместите все операторы соединения перед вызовами функций, которые могут запускать свои сигналы, чтобы гарантировать, что соединения будут установлены до того, как будут запущены сигналы. Например:

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

нет

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

Я нашел его по адресу https://samdutton.wordpress.com/2008/10/03/debugging-signals-and-slots-in-qt/

В любом случае, спасибо за ваши ответы!

person Juan Carlos Alvez Balbastro    schedule 30.08.2017