dognzhe
13th May 2009, 08:42
class ClientThread : public QThread
{
Q_OBJECT
public:
ClientThread(QObject *parent,int descriptor);
~ClientThread();
private:
int descriptor;
void run();
private slots:
void onFinish();
void tcpError( QAbstractSocket::SocketError error );
void onStateChanged( QAbstractSocket::SocketState socketState);
};
#include "clientthread.h"
ClientThread::ClientThread(QObject *parent, int descriptor)
: QThread(parent)//, socket(this)
{
this->descriptor=descriptor;
qWarning("ClientThread::ClientThread() %d\n", QThread::currentThreadId());
connect(this,SIGNAL(finished()),this,SLOT(onFinish ()));
}
ClientThread::~ClientThread()
{
}
void ClientThread::run(){
QTcpSocket socket;
if( !socket.setSocketDescriptor( descriptor ) )
{
qDebug( "Socket error!" );
return;
}
connect(&socket,SIGNAL( stateChanged (QAbstractSocket::SocketState)),this,SLOT (onStateChanged(QAbstractSocket::SocketState)));
connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(tcpError(QAbstractSocket::SocketError)) );
QString add=socket.peerAddress().toString();
qWarning()<<add;
qWarning("ClientThread::run() %d\n", QThread::currentThreadId());
exec();// this will keep the thread running.
}
void ClientThread::onFinish(){
int a = 12;
}
void ClientThread::tcpError(QAbstractSocket::SocketErro r error){
if( error == QAbstractSocket::RemoteHostClosedError )
return;
}
void ClientThread::onStateChanged( QAbstractSocket::SocketState socketState){
qWarning("ClientThread::onStateChanged() %d\n", QThread::currentThreadId());
switch (socketState){
case QAbstractSocket::UnconnectedState:
qWarning()<<"UnconnectedState";
default:
qWarning()<<socketState;
}
}
this two lines are not working :
connect(&socket,SIGNAL( stateChanged (QAbstractSocket::SocketState)),this,SLOT (onStateChanged(QAbstractSocket::SocketState)));
connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(tcpError(QAbstractSocket::SocketError)) );
and show error:
"QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
(Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType(
).)
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketState'
(Make sure 'QAbstractSocket::SocketState' is registered using qRegisterMetaType(
).)"
can anyone tell me how to link the signals of QtcpSocket to the slot in side of qthread???
qt is fucked
{
Q_OBJECT
public:
ClientThread(QObject *parent,int descriptor);
~ClientThread();
private:
int descriptor;
void run();
private slots:
void onFinish();
void tcpError( QAbstractSocket::SocketError error );
void onStateChanged( QAbstractSocket::SocketState socketState);
};
#include "clientthread.h"
ClientThread::ClientThread(QObject *parent, int descriptor)
: QThread(parent)//, socket(this)
{
this->descriptor=descriptor;
qWarning("ClientThread::ClientThread() %d\n", QThread::currentThreadId());
connect(this,SIGNAL(finished()),this,SLOT(onFinish ()));
}
ClientThread::~ClientThread()
{
}
void ClientThread::run(){
QTcpSocket socket;
if( !socket.setSocketDescriptor( descriptor ) )
{
qDebug( "Socket error!" );
return;
}
connect(&socket,SIGNAL( stateChanged (QAbstractSocket::SocketState)),this,SLOT (onStateChanged(QAbstractSocket::SocketState)));
connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(tcpError(QAbstractSocket::SocketError)) );
QString add=socket.peerAddress().toString();
qWarning()<<add;
qWarning("ClientThread::run() %d\n", QThread::currentThreadId());
exec();// this will keep the thread running.
}
void ClientThread::onFinish(){
int a = 12;
}
void ClientThread::tcpError(QAbstractSocket::SocketErro r error){
if( error == QAbstractSocket::RemoteHostClosedError )
return;
}
void ClientThread::onStateChanged( QAbstractSocket::SocketState socketState){
qWarning("ClientThread::onStateChanged() %d\n", QThread::currentThreadId());
switch (socketState){
case QAbstractSocket::UnconnectedState:
qWarning()<<"UnconnectedState";
default:
qWarning()<<socketState;
}
}
this two lines are not working :
connect(&socket,SIGNAL( stateChanged (QAbstractSocket::SocketState)),this,SLOT (onStateChanged(QAbstractSocket::SocketState)));
connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(tcpError(QAbstractSocket::SocketError)) );
and show error:
"QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
(Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType(
).)
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketState'
(Make sure 'QAbstractSocket::SocketState' is registered using qRegisterMetaType(
).)"
can anyone tell me how to link the signals of QtcpSocket to the slot in side of qthread???
qt is fucked