Qt-简单信号和;插槽错误传达

时间:2012-08-22 15:07:33

标签: c++ qt signals slots

我有一个源自QThread的Thread类:

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;
};

派生类:

class DerivedThread: public Thread
{
    Q_OBJECT
public:
    virtual void run();

    ~DerivedThread();

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

private:
    IQFeedSocket* m_Socket;
};

这很简单。然后我有一个Socket包装类,它在构造函数中接受一个Thread对象:

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(),并且它成功了,因为我在套接字对象中获得了OnMessage()调用,该调用在线程中实例化。 我想要做的很简单:在IQFeedSocket :: OnMessage中,我将检查消息接收是否已完成(它必须以“\ r \ n”结尾)并且当收到完整的消息时,将其转发给我在构造函数中注册的线程对象。 所以,在我的IQFeedSocket构造函数中,我这样做:

IQFeedSocket::IQFeedSocket(Thread *parent)
    : QObject(parent)
{
    m_ReceiveBuffer = new char();
    connect(this,SIGNAL(SendMessage(const char*)), this->parent(), SLOT(OnMessage(const char*)));
}

在OnMessage()方法中:

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 *)方法。我确信这是一个非常简单的监督,但我似乎无法发现我出错的地方。有任何想法吗? THX!

DerivedThread :: OnMessage(char *):

void DerivedThread::OnMessage(const char* msg)
{
        //This never gets called :(
    printf(msg);
    char* f;
    strcpy(f,msg);
}

编辑:我也尝试过DerivedThread端的connect():

m_Socket = new IQFeedSocket(this);
connect(m_Socket, SIGNAL(SendMessage(const char*)), this, SLOT(OnMessage(const char*)));
Thread::exec();

但没有运气。

1 个答案:

答案 0 :(得分:1)

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

即使在一个中使用typedef而在另一个中使用全名也足以打破它。