为什么QTcpSocket不发出信号?

时间:2013-08-13 14:24:41

标签: qt qt5 qtcpsocket

我遇到QTcpSocket问题,它没有发出任何信号:/


void NetworkInstance::run()
{
    m_pSocket = new QTcpSocket();
    connect(m_pSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError()));
    connect(m_pSocket, SIGNAL(hostFound()), this, SLOT(socketHostLookupDone()));
    connect(m_pSocket, SIGNAL(connected()), this, SLOT(socketConnected()));
    connect(m_pSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));

    connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(socketReadyRead()));

    QSettings s;
    s.beginGroup("network");
    emit log(QString("Connection to: ").append(s.value("host").toString()).append(":").append(s.value("port").toString()));
    m_pSocket->connectToHost(s.value("host").toString(), s.value("port").toInt());
    s.endGroup();

    exec();
}

这是我的代码,我没有看到任何错误,但是没有连接的信号正在发出(hostFound,connected等)。在服务器上,我可以看到建立连接并发送数据,但客户端没有任何反应。 NetworkInstance正在扩展QThread。

2 个答案:

答案 0 :(得分:2)

根据我之前的评论,子类化QThread是错误的,你需要做的是创建从QObject继承的类,然后将其移动到新的QThread。

所以你有一个看起来像这样的课: -

class NetworkInstance : public QObject
{
    Q_OBJECT

public:
    NetworkInstance();

public slots:
    void Run();

    void socketConnected();
    void socketError();
    // etc for other slots...

private:
    class QTCPSocket* m_pSocket;
}

创建您的网络实例对象和线程: -

QThread* pThread = new QThread;
NetworkInstance* pNetworkInstance = new NetworkInstance;

创建QTCPSocket实例并连接NetworkInstance类中的信号/插槽,然后创建QThread并将您的类移动到该线程: -

pNetworkInstance->moveToThread(pThread);

最后,启动线程运行: -

pThread->start();

答案 1 :(得分:0)

我确信信号是发出的。我不太确定他们是否被其他线程中的插槽接收。应该。一般。

  

Qt :: AutoConnection

     

(默认)如果信号是从不同的线程发出的   接收对象,信号排队,表现为   Qt的:: QueuedConnection。否则,直接调用插槽,   表现为Qt :: DirectConnection。确定连接类型   当信号发出时。

但是现在你在run()中用exec()开始自己的eventloop。

编辑:啊......我明白了......

  

Qt :: QueuedConnection

     

当控制返回时,调用插槽   接收者线程的事件循环。插槽在中执行   接收者的主题。

这是自动使用的,因为发送方和接收方处于不同的线程中。但是使用'exec()',控件永远不会返回接收者的线程。