2012-08-22 33 views
0

我有一个Thread类,多数民众赞成从QThread的派生:QT间简易信号和老虎Misscommunication

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调用exec():: run()方法,它是成功的,因为我得到的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线,但随后在onMessage(从DerivedThread对象的char *)方法永远不会被调用。我相信这是一个非常简单的监督,但我似乎无法找到我要出错的地方。有任何想法吗?谢谢!在DerivedThread身边,我也尝试过的connect():

的DerivedThread ::的onMessage(字符*):

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

编辑

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

,但没有运气。

回答

1

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

即使在一个中使用typedef,在另一个中使用全名也足以将其分开。

+0

Thx!我添加了“常量”,但必须有其他东西,仍然不起作用:) –

+1

可以看到任何obviosu,但检查出http://samdutton.wordpress.com/2008/10/03/debugging-信号 - 和 - 插槽式-QT / –