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

Code: Alles auswählen

#include *.moc
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... :roll:
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... :roll:
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