Слоты и сигналы в Qt C++ в приложении QTcpServer

Есть вопрос о слотах и ​​сигналах в Qt C++ в приложении QTcpServer. Я не очень знаком со слотами и подходами к сигналам. Итак... проблема в том, что слоты для клиентского сокета на серверном приложении вообще не запускаются. Я думаю, что я использую функцию соединения с неправильными параметрами.

class CMyClient {
public:
    CMyClient();
    QTcpSocket* m_pClientSocket;
    MainWindow* m_pWin;
public slots:
    void onSocketReadyRead();
    void onSocketConnected();
    void onSocketDisconnected();
    void onSocketDisplayError(QAbstractSocket::SocketError);

Я использую функции подключения здесь:

void MainWindow::onNewConnection()
{
    CMyClient* pClient = new CMyClient();

    // set properties
    pClient->m_pClientSocket = m_pServSocket->nextPendingConnection();
    pClient->m_pWin = this;

    // events from client side on server side
    connect(pClient->m_pClientSocket, SIGNAL(readyRead()), SLOT(onSocketReadyRead()));
    connect(pClient->m_pClientSocket, SIGNAL(connected()), SLOT(onSocketConnected()));
    connect(pClient->m_pClientSocket, SIGNAL(disconnected()), SLOT(onSocketDisconnected()));
    connect(pClient->m_pClientSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketDisplayError(QAbstractSocket::SocketError)));

... Но эти функции подключения не работают должным образом. Клиенты подключаются, вызывается onNewConnection, но события (слоты) из клиентского сокета не возникают (readyRead() и т. Д.). Сервер может отправлять сообщения клиентам. Благодарю.

1 ответ

Решение

Чтобы использовать сигналы и слоты, класс должен наследовать от QObject, в твоем случае CMyClient Вы должны изменить это на что-то похожее на:

.*час

class CMyClient: public QObject {
    Q_OBJECT
public:
    CMyClient(QObject *parent= 0);
    QTcpSocket* m_pClientSocket;
    MainWindow* m_pWin;
public slots:
    void onSocketReadyRead();
    void onSocketConnected();
    void onSocketDisconnected();
    void onSocketDisplayError(QAbstractSocket::SocketError);
};

.cpp

CMyClient::CMyClient(QObject *parent): QObject(parent){

}

Согласно документации:

connect(const QObject * sender, сигнал const char *, const QObject * receive, метод const char *, тип Qt::ConnectionType)

connect (const QObject * sender, сигнал const char *, метод const char *, тип Qt::ConnectionType)

connect (const QObject * отправитель, сигнал PointerToMemberFunction, const QObject * получатель, метод PointerToMemberFunction, тип Qt:: ConnectionTyp e)

connect (const QObject * sender, сигнал PointerToMemberFunction, функтор функтора)

connect(const QObject * sender, сигнал PointerToMemberFunction, const QObject * context, функтор Functor, тип Qt::ConnectionType)

Так что в вашем случае отсутствует место для размещения объекта-получателя.

CMyClient* pClient = new CMyClient(this);

connect(pClient->m_pClientSocket, SIGNAL(readyRead()), pClient, SLOT(onSocketReadyRead()));
connect(pClient->m_pClientSocket, SIGNAL(connected()), pClient, SLOT(onSocketConnected()));
connect(pClient->m_pClientSocket, SIGNAL(disconnected()), pClient, SLOT(onSocketDisconnected()));
connect(pClient->m_pClientSocket, SIGNAL(error(QAbstractSocket::SocketError)), pClient, SLOT(onSocketDisplayError(QAbstractSocket::SocketError)));
Другие вопросы по тегам