Seite 1 von 1

[gelöst]Qt2.3: Qthread Probleme nach Erzeugung der moc-Datei

Verfasst: 4. September 2006 15:26
von nik_28
Hallo, ich habe ein Problem mit Qt 2.3:

Ich möchte die Klasse QThread erben und schreibe dazu in den Header:

Code: Alles auswählen

...
#define QT_THREAD_SUPPORT 
#define _CRT_SECURE_NO_DEPRECATE

#include <qthread.h>
#include <qsocket.h>


class ServerThread : public QThread
{
	Q_OBJECT

public:
	ServerThread(int socketDescriptor, const QString &gossip, QObject *parent);
	~ServerThread(void);
... 
Dann kompiliere ich das cpp-File (wo ich alles auskommentiert habe, was Fehler verursachen könnte), worauf der Präcompiler ein moc-file erzeugt. Wenn nun aber die moc-Datei kompiliert wird, erscheinen drei Fehlermeldungen:

Code: Alles auswählen

moc_serverthread.cpp(33) : error C2039: 'className' : is not a member of 'QThread'
\qt\include\qthread.h(77) : see declaration of 'QThread'
moc_serverthread.cpp(34) : error C3861: 'badSuperclassWarning': identifier not found
moc_serverthread.cpp(56) : error C2039: 'staticMetaObject' : is not a member of 'QThread'
\qt\include\qthread.h(77) : see declaration of 'QThread'
Dies verwirrt mich vorallem deshalb, weil der moc-Code ja gar nicht von mir stammt.
Der sieht, ab Zeile 29, ungefähr so aus:

Code: Alles auswählen

void ServerThread::initMetaObject()
{
    if ( metaObj )
	return;
    if ( qstrcmp(QThread::className(), "QThread") != 0 )
	badSuperclassWarning("ServerThread","QThread");
    (void) staticMetaObject();
}

#ifndef QT_NO_TRANSLATION

QString ServerThread::tr(const char* s)
{
    return qApp->translate( "ServerThread", s, 0 );
}

QString ServerThread::tr(const char* s, const char * c)
{
    return qApp->translate( "ServerThread", s, c );
}

#endif // QT_NO_TRANSLATION

Verfasst: 4. September 2006 15:36
von Christian81
QThread ist nicht von QObject abgeleitet, also auch kein Q_OBJECT nötig & möglich.
http://doc.trolltech.com/2.3/moc.html

Warum das total veraltete Qt 2.3?

Verfasst: 4. September 2006 15:49
von nik_28
Dankeschön!

Ich dachte ich hätte das Q_OBJECT schon mal rausgenommen und er hätte sich dann beschwert ... vielleicht hab' ich das nur geträumt, jetzt läufts auf jeden Fall!

Qt 2.3. weil mein Projekt auf einem älteren Projekt aufsetzen soll, das Qt 2.3 verwendet. Außerdem ist das wohl so eine Lizenzgeschichte hier an der Uni.

Noch mal Danke, jedenfalls!

Verfasst: 4. September 2006 15:53
von Christian81
Steht zwar schon oben, aber: Wenn Du signals/slots brauchst, einfach von QObject ableiten - dann geht auch Q_OBJECT korrekt.

Verfasst: 4. September 2006 17:16
von nik_28
Genau, das war das Problem gewesen (die Signals und Slots die ich verwende).

Jetzt siehts so aus:

Code: Alles auswählen

class ServerThread : public QThread, QObject
dafür aber mit Q_OBJECT

Verfasst: 4. September 2006 17:32
von nik_28
So siehts aus:

Code: Alles auswählen

class ServerThread : public QObject, public QThread 
{
	Q_OBJECT
... 
(Die Reihenfolge der Vererbung spielt eine Rolle(?))

Verfasst: 4. September 2006 19:04
von Christian81
Ja, die Reihenfolge spielt eine Rolle - es ist immer die erste abgeleitete Klasse. Das liegt daran, dass moc nicht erkennen kann welche der Klassen nun von QObject kommt (man müsste viel zu viel parsen) und deshalb immer die erste nimmt.