[Qt4-preview-feedback] QT4 + QThread and Q_OBJECT compile problem

Igor Grivko grivna at pangea.ru
Wed May 21 13:05:20 CEST 2008


Hi,

Please, just run qmake in your project directory. If you added Q_OBJECT macro 
then qmake should generate special moc files (where your slots functions will 
be).


Best regards,
Igor Grivko


On Wednesday 21 May 2008 02:52:35 pm ferrety ferrety wrote:
> Hi List,
> I'm trying to add a slot to my very simple HTTP server using QThread.
> First, I tried with this simple code :
>
>
> ---------------- serverthread.h ---------------
> #ifndef SERVERTHREAD_H
> #define SERVERTHREAD_H
>
> #include <QThread>
>
> class ServerThread : public QThread
> {
> public:
>   ServerThread( int descriptor, QObject *parent );
>   void run();
>
> public slots:
>   void onReadReady();
>
> private:
>   int m_descriptor;
>   QTcpSocket * ourSocket;
> };
>
> #endif // SERVERTHREAD_H
> ---------------------------------------------------------
>
> ---------------- serverthread.cpp ---------------
> #include <QtNetwork>
>
> #include "serverthread.h"
>
> ServerThread::ServerThread( int descriptor, QObject *parent ) :
>   QThread( parent )
> {
>   m_descriptor = descriptor;
> }
>
> void ServerThread::run()
> {
>   QTcpSocket socket;
>
>   if( ! socket.setSocketDescriptor( m_descriptor ) )
>   {
>     qDebug( "Socket error!" );
>     return;
>   }
>
>   ourSocket = & socket;
>
>   connect (ourSocket, SIGNAL (readyRead()),    this, SLOT (onReadyRead
> ()));
>
>   exec ();
>
>   socket.disconnectFromHost ();
>   socket.waitForDisconnected ();
>
>   ourSocket = NULL;
> }
>
> void ServerThread::onReadReady()
> {
>   qDebug() << "Connexion from host:" << ourSocket -> peerAddress () .
> toString ();
> }
> ---------------------------------------------------------
>
> Now running the server :
>
> ./tcpserver
>
> When calling the server, I got this error message :
>
> ./tcpserver
> Object::connect: No such slot QThread::onReadyRead()
>
> After googling a bit, I found that I've to add the macro "Q_OBJECT" to my
> thread class.
> So, it became :
>
> ---------------- serverthread.h ---------------
> #ifndef SERVERTHREAD_H
> #define SERVERTHREAD_H
>
> #include <QThread>
>
> class ServerThread : public QThread
> {
> Q_OBJECT
>
> public:
>   ServerThread( int descriptor, QObject *parent );
>   void run();
>
> public slots:
>   void onReadReady();
>
> private:
>   int m_descriptor;
>   QTcpSocket * ourSocket;
> };
>
> #endif // SERVERTHREAD_H
> ---------------------------------------------------------
>
> Now, I got a compile problem to fix :
>
> serverthread.h:19: error: ISO C++ forbids declaration of 'QTcpSocket' with
> no type
> serverthread.h:19: error: expected ';' before '*' token
> make: *** [moc_serverthread.o] Error 1
>
> Line 19 is related to the declaration of :
> QTcpSocket * ourSocket;
>
> which compiles just fine in my first test without "Q_OBJECT".
>
> I'm completly lost.
> Any advices please ?
>
> Thanks in advance
>
> N.B: I've tested it on QT 4.4.0 and 4.3.4 and I've faced the same problem.
>
> Regards
>
> F.




More information about the Qt4-preview-feedback mailing list