Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Ошибка при выполнении MOC.


Автор: Fighter 29.1.2011, 00:36
Исходная задача:
Есть QT 4.6.2.
Среда разработки - Visual Studio. 
С сайта скачал и SDK и Visual Studio Add-in. 
Далее, из книжки Макса Шлее написал примерчик:
Код

#include "qtapp.h"
#include <QtGui/QApplication>
#include <QtGui/QLabel>
#include <QtGui>
#include <QtCore>

class MySignal {
    Q_OBJECT
public:
    void sendSignal()
    {
        emit DoIt();
    }
    void sendSignal2()
    {
        emit SendString("Hello man");
    }

signals:
    void DoIt();
    void SendString(const QString&);
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qtApp q = new qtApp();
    q.show();
    

    return a.exec();
}



При компиляции выдает ошибку: Error    1    error PRJ0019: A tool returned an error code from "Moc'ing main.moc..."    qtApp    qtApp


Не знаю что делать. может быть автоматической установки мало для полной настройки VS???

Автор: Modul 29.1.2011, 13:48
Пример работы с сигналом и слотом.

My.h
Код

#ifndef _My_h_
#define _My_h_

#include <QObject>


class My : public QObject 
{ 
    Q_OBJECT
    

public slots: 
      void run();

public:    
    signals: 
      void process(int);

};

#endif //_My_h_


My.cpp
Код

#include "My.h"

void My::run() 
{ 
            
    int res = 123;

    // Подает сигнал
    if (res) emit process(res);
}


main.cpp
Код

#include <QApplication>
#include <QtGui>
#include "My.h"


int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv);

    QWidget wgt;    
    // мой объект
    My my; 

    // метка
    QLabel label("Label");
    // кнопка
    QPushButton pushButton("Run");

    // нажали кнопку, приняли сигнал
    QObject::connect(&pushButton, SIGNAL(clicked() ), &my, SLOT(run() ));        
    QObject::connect(&my, SIGNAL( process(int) ), &label, SLOT( setNum(int) ));    
    
    // вертик. менеджер 
    QVBoxLayout verLayout; 
    verLayout.addWidget(&label); 
    verLayout.addWidget(&pushButton);    
    wgt.setLayout(&verLayout);
    wgt.show(); 
 
    return app.exec(); 
}


Автор: alexvs11 29.1.2011, 17:32
Fighter, все классы работающие с сигналами/слотами должны быть описаны в отдельном .h файле/определены в отдельном .cpp

Автор: Fighter 29.1.2011, 19:59
Цитата(alexvs11 @ 29.1.2011,  17:32)
Fighter, все классы работающие с сигналами/слотами должны быть описаны в отдельном .h файле/определены в отдельном .cpp

1. У меня все заработало после переустановки QT. Я скачал самую новую на данный момент QT 4.7.1 и все соответствующие ей компоненты. В результате у меня все замечательно работает и в QT Creator, VS2008 и в VS2010. 
2. Разбиение на *.h и *.cpp файлы - это не обязательное условие языка С++ вообще, и библиотеки QT применительно к слотам и сигналам в частности. Разбиение на файлы сделано исключительно для удобства программиста. Всю программу можно написать и в одном файле. Все равно, когда запускается процесс сборки сначала препроцессор создает конечные файлы для компиляции, например, выполняя команды #include - именно включая содержимое хедеров в cpp. Кроме этого, в QT в частности метаобъектный компилятор обрабатывает макросы Q_OBJECT и многие другие. В конечном итоге сам компилятор компилирует как будто ты писал все в одном большом файле. Да и действительно, любую программу можно написать в одном CPP файле, просто разбираться в ней будет сложно. 

В общем, проблема решена, спасибо всем)))

Автор: alexvs11 29.1.2011, 20:07
Fighter, спасибо,  все знают, что для с++ это не обязательно, но moc-компилятор может не справиться  smile 

Автор: Fighter 30.1.2011, 12:14
Цитата(alexvs11 @ 29.1.2011,  20:07)
Fighter, спасибо,  все знают, что для с++ это не обязательно, но moc-компилятор может не справиться  smile

Справится, он умный))))) У меня во всяком случае справляется)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)