Unterschied zwischen moc_*.cpp und *.moc -File

Alles rund um die Programmierung mit Qt
Antworten
Scary Hallo

Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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.
:?:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Scary Hallo

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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.
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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.
Zuletzt geändert von odt am 4. November 2014 13:39, insgesamt 2-mal geändert.
ODT Informatik GmbH, Reto Tschofenig
Scary Hallo

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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.
ODT Informatik GmbH, Reto Tschofenig
Scary Hallo

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag von Scary Hallo »

Es bleibt die Frage, wann werden *.moc-Dateien erstellt und wann nicht? Und wo ist das dokumentiert?
:?:
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Unterschied zwischen moc_*.cpp und *.moc -File

Beitrag 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
ODT Informatik GmbH, Reto Tschofenig
Antworten