首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt- Simple Signal & Slot Misscommunication

Qt- Simple Signal & Slot Misscommunication
EN

Stack Overflow用户
提问于 2012-08-22 23:07:33
回答 1查看 251关注 0票数 0

我有一个从QThread派生的Thread类:

代码语言:javascript
复制
class Thread :
    public QThread
{
    Q_OBJECT
public:
    Thread(QObject* parent = NULL);
    ~Thread(void);

    virtual void run();
    void stop();

public slots:
    virtual void OnMessage(const char* msg);

protected:
    bool m_Done;
};

和一个派生类:

代码语言:javascript
复制
class DerivedThread: public Thread
{
    Q_OBJECT
public:
    virtual void run();

    ~DerivedThread();

public slots:
    virtual void OnMessage(const char* msg);

private:
    IQFeedSocket* m_Socket;
};

这是非常直接的。然后我有一个套接字包装类,它在其构造函数中接受一个Thread对象:

代码语言:javascript
复制
class IQFeedSocket : public QObject
{
    Q_OBJECT

public:
    IQFeedSocket(Thread *parent);
    ~IQFeedSocket();

    bool Connect(int port);
    bool Write(const char* msg);

public slots:
    void OnMessage();

signals:
    void SendMessage(const char* msg);

private:
    QTcpSocket* m_Socket;
    char* m_ReceiveBuffer;
};

现在,我确实在DerivedThread::run()方法中调用了exec(),并且它是成功的,因为我在socket对象中获得了OnMessage()调用,该对象在线程中实例化。我想要做的非常简单:在IQFeedSocket::OnMessage中,我将检查消息接收是否完成(它必须以“\r\n”结束),当接收到完整的消息时,将其转发到在构造函数中注册的Thread对象。因此,在我的IQFeedSocket构造函数中,我这样做:

代码语言:javascript
复制
IQFeedSocket::IQFeedSocket(Thread *parent)
    : QObject(parent)
{
    m_ReceiveBuffer = new char();
    connect(this,SIGNAL(SendMessage(const char*)), this->parent(), SLOT(OnMessage(const char*)));
}

在OnMessage()方法中:

代码语言:javascript
复制
void IQFeedSocket::OnMessage()
{
    const char* msg;
    if(m_Socket->bytesAvailable() != 0) //More stuff needed
    {
        QByteArray msgArray = m_Socket->readAll();
        msg = msgArray;
        emit SendMessage(msg);
    }
}

当我进行调试时,我到达了emit行,但是之后从未调用过来自DerivedThread对象的OnMessage(char*)方法。我确信这是一个非常简单的监督,但我似乎找不到我哪里错了。有什么想法吗?谢谢!

DerivedThread::OnMessage(char*):

代码语言:javascript
复制
void DerivedThread::OnMessage(const char* msg)
{
        //This never gets called :(
    printf(msg);
    char* f;
    strcpy(f,msg);
}

编辑:我还尝试了在DerivedThread端使用connect():

代码语言:javascript
复制
m_Socket = new IQFeedSocket(this);
connect(m_Socket, SIGNAL(SendMessage(const char*)), this, SLOT(OnMessage(const char*)));
Thread::exec();

但没那么走运。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-22 23:13:05

信号/插槽定义和连接调用中的参数必须完全匹配,包括const

即使在一个文件中使用typedef,在另一个文件中使用全名,也足以破坏它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12076123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档