我有一个源自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();
但没有运气。
答案 0 :(得分:1)
信号/插槽定义和连接调用中的参数必须完全匹配,包括const
。
即使在一个中使用typedef而在另一个中使用全名也足以打破它。