Есть вопрос о слотах и сигналах в 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 () и т. Д.). Сервер может отправлять сообщения клиентам. Благодарю.
Чтобы использовать сигналы и слоты, класс должен наследовать от 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)));
Других решений пока нет …