Слоты и сигналы в 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 () и т. Д.). Сервер может отправлять сообщения клиентам. Благодарю.

0

Решение

Чтобы использовать сигналы и слоты, класс должен наследовать от 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){

}

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

соединять(const QObject * Отправитель, const char *сигнал, const QObject *получатель, const char * Метод, Qt :: ConnectionType тип)

соединять(const QObject * Отправитель, const char *сигнал, const char * Метод, Qt :: ConnectionType тип)

соединять(const QObject * Отправитель,PointerToMemberFunction сигнал, const QObject *получатель, PointerToMemberFunction метод, Qt :: ConnectionTypэлектронный тип)

соединять(const QObject * Отправитель, PointerToMemberFunction сигнал, Функтор функтор)

соединять(const QObject * Отправитель, PointerToMemberFunction сигнал, const QObject * Контекст, Функтор функтор, 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)));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]