Seite 1 von 1
Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 3. November 2014 15:42
von Scary Hallo
Hallo,
ich habe einmal eine Grundlagen-Frage. Was ist der Unterschied zwischen moc_*.cpp und *.moc -Files.
In der Qt-Dokumentation habe ich gelesen, wenn man das Q_OBJECT-Marcro in einer Source-Datei benutzen will, muss man am Ende
schreiben. Bei mir wird aber keine *.moc erzeugt.

Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 3. November 2014 18:30
von Christian81
ein '#include *.moc' wird dir wohl auch hoffentlich einen Compiler-Fehler bringen...
Der Rest stimmt - ist aber nur eine Notation - moc_*.cpp für aus Header-Dateien generierten Code, das andere für aus Source-Dateien generierten Code.
/edit: und wie immer - ein *minimales* Beispiel (was hier ja nicht schwer sein sollte) wäre nicht schlecht.
Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 4. November 2014 11:07
von Scary Hallo
Christian81 hat geschrieben:ein '#include *.moc' wird dir wohl auch hoffentlich einen Compiler-Fehler bringen...
Es scheint wohl eine gängige (leider undokumentierte) Praxis zu sein, wenn man Q_Objekt in einer *.cpp-Datei benutzen will. Hier mal ein
Beispiel aus einem Qt-Kurs, der Dozent möge mir verzeihen:
Code: Alles auswählen
// tst_unittesttesttest.cpp
#include <QString>
#include <QtTest>
class UnittesttestTest : public QObject
{
Q_OBJECT
public:
UnittesttestTest();
private Q_SLOTS:
void testCase1();
void testCase2();
void testCase3();
};
UnittesttestTest::UnittesttestTest()
{
}
void UnittesttestTest::testCase1()
{
QString input = "HaLlO";
QString expected = "hallo";
QVERIFY2(input.toLower() == expected, "Failure");
}
void UnittesttestTest::testCase2()
{
QList<int> list;
QBENCHMARK {
list << 10;
list.removeOne(10);
}
}
void UnittesttestTest::testCase3()
{
QList<int> list;
QBENCHMARK {
list << 10;
list.removeAll(10);
}
}
QTEST_APPLESS_MAIN(UnittesttestTest)
#include "tst_unittesttesttest.moc"
Hier wird eine "tst_unittesttesttest.moc" erzeugt. In meiem Beispiel (das ich leider nicht veröffentlichen darf) nicht.
Deshalb meine Frage:
Wann werden moc_*.cpp-Dateien erzeugt, und wann *.moc ? Oder woran kann es liegen, dass keine *.moc-Datei erzeugt wird?
Ich arbeite mit qmake im QtCreator.
Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 4. November 2014 11:55
von odt
Falsche Info: Wie Du bereits herausgefunden hast: .moc-Dateien werden nur generiert, wenn die Q_OBJECT-Deklaration in einem cpp-File ist und das makefile händisch gemacht wird. Bei einem qmake-Projekt unüblich, da kompliziert und eigentlich unnötig.
Ich empfehle, die Klassendeklaration mit dem Q_OBJECT in ein eigenes Header-File, also UnittesttestTest.h zu verschieben. Dann macht qmake "Alles" für Dich.
Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 4. November 2014 13:28
von Scary Hallo
odt hat geschrieben:Wie Du bereits herausgefunden hast: .moc-Dateien werden nur generiert, wenn die Q_OBJECT-Deklaration in einem cpp-File ist und das makefile händisch gemacht wird. Bei einem qmake-Projekt unüblich, da kompliziert und eigentlich unnötig.
Das stimmt nicht. In dem o.g. Beispiel wird wird die Datei "tst_unittesttesttest.moc" erzeugt
ohne das makefile anzufassen.
Diese Praxis (ob gut oder schlecht) wird auch in den Examples von Qt angewandt.
http://qt-project.org/doc/qt-5/qttestli ... g-cpp.html
Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 4. November 2014 13:40
von odt
Bitte entschuldige die vorherige Falschinfo meinerseits. Ich hatte nach einigen misslungenden Versuchen, eine Q-Klasse innerhalb des CPPs zu deklarieren, die Dokumentation falsch interpretiert.
Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 5. November 2014 08:18
von Scary Hallo
Es bleibt die Frage, wann werden *.moc-Dateien erstellt und wann nicht? Und wo ist das dokumentiert?

Re: Unterschied zwischen moc_*.cpp und *.moc -File
Verfasst: 5. November 2014 09:03
von odt
Was ich an Doku fand, ist nicht wirklich hilfreich. Im
http://qt-project.org/doc/qt-5/moc.html#moc steht:
The moc tool reads a C++ header file. If it finds one or more class declarations that contain the Q_OBJECT macro, it produces a C++ source file containing the meta-object code for those classes.
Im Abschnitt der manuellen Makefiles
For Q_OBJECT class declarations in implementation (.cpp) files...
You can then put #include "foo.moc" at the end of foo.cpp, where all the classes declared in that file are fully known.
Dies scheint zu wirken.
Tips:
- Falsche Info: Möglicherweise: der include muss wirklich auf der letzten Zeile steht (allfällige Linebreaks löschen)
- qmake neu aufrufen