2017-07-16 98 views
0

QTcpServer应用程序中有一个关于Qt C++中的插槽和信号的问题。我不太熟悉插槽和信号的方法。所以...问题是服务器应用上的客户端套接字插槽根本没有被调用。我认为我使用连接功能与错误的参数。在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()等)。服务器能够发送消息给客户端。谢谢。

回答

2

为了使用信号和槽的类必须从QObject继承,你的情况CMyClient您必须将其更改为类似的东西:

* H

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){ 

} 

按照documentation

连接常量的QObject *发件人,常量字符 *信号,常量的QObject *接收机,常量字符 *方法,Qt :: ConnectionType类型)

连接常量的QObject *发件人,常量字符 *信号,常量字符 *方法,Qt的:: ConnectionType型)

连接常量的QObject *发件人,PointerToMemberFunction signal,const QObject * receiver,PointerToMemberFunction方法,Qt的:: ConnectionTyp e型)

连接常量的QObject *发件人,PointerToMemberFunction信号,函子算符)

连接常量的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))); 
+0

非常感谢。我知道新的东西。它的工作原理。我转移到了这种方式,但忘了将Q_OBJECT添加到我的课程中。 –

+0

如果我的答案可以帮助您将其标记为正确。 – eyllanesc

+0

@eyllanesc - 在C++类中声明以';' – dtech