Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Зачем подключают *.moc файлы в Qt?

#qt #cpp


Я видел некоторые примеры кода, где в определенном месте кода написана строка:
#include "filename.moc" //filename

Зачем это делается?
Вот, например:
#include 
#include 

class MyProcessEventDispatcher: public QObject
{
    Q_OBJECT

public:
       MyProcessEventDispatcher(QObject *parent = 0) 
          : QObject (parent) 
        {
                connect(&m_timer, SIGNAL(timeout()), SLOT(updateEvents()));
                m_timer.setInterval(100);                
                m_timer.start();
       }

private slots:
      void updateEvents() 
      {
            m_timer.start();
            qApp->processEvents();
       }

private:
    QTimer m_timer;     
};

#include "main.moc"
int main(int argc, char **argv)
{
      QApplication app(argc, argv);
      MyProcessEventDispatcher mpee;
      //...  
      return app.exec();
}
    


Ответы

Ответ 1



Как я понимаю, это делается тогда, когда для создания make-файлов используется не утилитка qmake, а что-то другое. Если Вы для компиляции и всего остального используете QT это делать не нужно и даже не рекомендуется. Выдержка из книжки "Макс Шлее - QT 4.5. Профессиональное программирование на C++" (стр. 66): Созданные moc-файлы не стоит включать с помощью команды препроцессора #include "main.moc" в конец основного файла. ... Лучше если они будут отдельно откомпилированы и подсоединены компоновщиком к основной программе. Также можно привести цитатку отсюда: The C++ source file generated by moc must be compiled and linked with the implementation of the class. If you use qmake to create your makefiles, build rules will be included that call the moc when required, so you will not need to use the moc directly. Т.е. на мой взгляд при написании программ в QT лучше этого не делать. QT сделает все за вас.

Ответ 2



Метаобъектный компилятор - MOC для каждой библиотеки где есть классы с макросом Q_OBJECT создаёт файлы moc_*.cpp, содержащие таблицу виртуальных методов, чтобы нормально отрабатывались сигналы и слоты. Если лениво создавать отдельную библиотеку с классом, содержащим собственные сигналы и слоты, и класс описывается в файле совместно с функцией main (это также нужно не из-за лени а для демонстнрации возможностей, например при обучении Qt), то компилировать такой код нужно так: moc -o main.moc main.cpp make main.cpp При компиляции через QtCreator нужно вручную, после каждого изменения сигналов и слотов, вызвать команду moc -o main.moc main.cpp

Комментариев нет:

Отправить комментарий