为什么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。

基于我之前的评论,即子类化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();

我确信信号已经发出。我不太确定它们是否被另一个线程中的插槽接收到。应该是。正常情况下。

Qt::自动连接

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

但现在您可以在run()中使用exec()启动自己的事件循环。

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

Qt::排队连接

当控件返回到接收器线程的事件循环。插槽在接收器的线程。

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

相关内容

  • 没有找到相关文章

最新更新