Слоты и сигналы в 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)));