Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Alex_cs_gsp от Сентябрь 15, 2010, 17:19



Название: Ошибка при указании макроса Q_OBJECT
Отправлено: Alex_cs_gsp от Сентябрь 15, 2010, 17:19
Изучаю события, вот играясь наткнулся на ошибку, которая происходит если раскомменитровать  //Q_OBJECT ???

Код:
#include <QApplication>
#include <QtGui>

class CSpyLineEdit : virtual public QLineEdit
{
    //Q_OBJECT

public:
    CSpyLineEdit(QWidget *parent = 0):QLineEdit(parent){}

protected:
    void keyPressEvent(QKeyEvent *pKeyEvent)
    {
        if (pKeyEvent->key()==Qt::Key_0 && pKeyEvent->modifiers()==Qt::AltModifier)
        {
            this->setText("Clear complete");
        }

        else
        {
            QLineEdit::keyPressEvent(pKeyEvent);
        }
    }
};


int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    QWidget wgt;

    QVBoxLayout *pVboxLayout = new QVBoxLayout();

    CSpyLineEdit *pSpyLineEdit = new CSpyLineEdit();
    pSpyLineEdit->setMinimumSize(QSize(200,100));
    pVboxLayout->addWidget(pSpyLineEdit);

    pVboxLayout->setMargin(20);
    wgt.setLayout(pVboxLayout);
    wgt.show();

   return app.exec();
}


//Compile output
mingw32-make: Leaving directory `D:/QT/MyModel/MyModel'
debug/main.o: In function `CSpyLineEdit':
D:\QT\MyModel\MyModel/../main.cpp:11: undefined reference to `vtable for CSpyLineEdit'
D:\QT\MyModel\MyModel/../main.cpp:11: undefined reference to `vtable for CSpyLineEdit'
D:\QT\MyModel\MyModel/../main.cpp:11: undefined reference to `vtable for CSpyLineEdit'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\MyModel.exe] Error 1
mingw32-make: *** [debug] Error 2
Exited with code 2.
Error while building project MyModel
When executing build step 'Make'



Build issues:
D:\QT\MyModel\MyModel/../main.cpp:11: undefined reference to `vtable for CSpyLineEdit'
:-1: error: collect2: ld returned 1 exit status





Название: Re: Ошибка при указании макроса Q_OBJECT
Отправлено: BRE от Сентябрь 15, 2010, 17:28
В конец своего файла добавь:
#include "main.moc"

Выполни:
qmake
make

За подробностями в поиск и документацию.  :)


Название: Re: Ошибка при указании макроса Q_OBJECT
Отправлено: Alex_cs_gsp от Сентябрь 15, 2010, 20:35
Помогло. А чё раньше я такой проблемы не замечал? Можно ответ по-подробнее пожалуйста, или ссылку. И без макроса Q_OBJECT все работает как нужно. Просто в Шлеевской книге говорится, что напрямую подключать #include "main.moc"  не годится (стр.69). Спасибо.


Название: Re: Ошибка при указании макроса Q_OBJECT
Отправлено: lit-uriy от Сентябрь 15, 2010, 21:09
qmake просматривает h-файлы, чтобы дать задания для moc'а. А в cpp-файлах он не ищет объявления класса.

Т.е. если ты класс объявляешь в cpp-файле, то должен руками инклюд написать. Если же объявление и реализация разнесены по h/cpp файлам. То qmake сам справится.


Название: Re: Ошибка при указании макроса Q_OBJECT
Отправлено: Alex_cs_gsp от Сентябрь 15, 2010, 21:17
Спасибо ;)