9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
1

Q_OBJECT undefined reference to vtable

01.07.2013, 09:06. Показов 13305. Ответов 13
Метки нет (Все метки)

Не могу понять почему ругается компилер на виртуальные таблицы при добавлении макроса Q_OBJECT. Может кто подскажет в чем дело? выдает D:\progs\mpr\main.cpp:18: error: undefined reference to `vtable for MyBrightness'

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <QtWidgets/QApplication>
#include <QImage>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QtWidgets/QSlider>
#include <QObject>
 
 
class MyBrightness : public QWidget{
Q_OBJECT
private:
    QImage *mImg;
    QLabel *lbl;
public:
    MyBrightness(QWidget *wgt = 0):QWidget(wgt){
        mImg = new QImage(":/MacOs.png");
        lbl = new QLabel;
        QHBoxLayout *hbl = new QHBoxLayout;
        QSlider *slider = new QSlider;
        slider->setMinimum(-150);
        slider->setMaximum(150);
        slider->setPageStep(1);
        QObject::connect(slider,SIGNAL(valueChanged(int)),this,SLOT(MySlot(int)));
        *mImg = mImg->scaled(100,100);
        lbl->setFixedSize(mImg->size());
        hbl->addWidget(slider);
        hbl->addWidget(lbl);
        setLayout(hbl);
    }
 
    QImage brightness(const QImage& imgOrig, int n)
    {
        QImage img = imgOrig;
        qint32 nHeight = img.height();
        qint32 nWidth = img.width();
 
        for(qint32 i = 0; i < nHeight; ++i){
            QRgb *tempLine = reinterpret_cast<QRgb*>(img.scanLine(i));
 
            for(qint32 j = 0; j < nWidth; ++j){
                int r = qRed(*tempLine) + n;
                int g = qGreen(*tempLine) + n;
                int b = qBlue(*tempLine) + n;
                int a = qAlpha(*tempLine);
 
                *tempLine++ = qRgba(r > 255 ? 255 : r < 0 ? 0 : r,
                                    g > 255 ? 255 : g < 0 ? 0 : g,
                                    b > 255 ? 255 : b < 0 ? 0 : b,
                                    a
                                    );
            }
        }
        return *mImg;
    }
 
public slots:
    void MySlot(int n){
        lbl->setPixmap(QPixmap::fromImage(brightness(*mImg,n)));
    }
 
};
 
 
 
int main(int argc, char** argv)
{
    QApplication app(argc,argv);
    MyBrightness b1;
 
    b1.show();
    return app.exec();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2013, 09:06
Ответы с готовыми решениями:

undefined reference to `vtable for TLabel'
Добрый вечер . Помогите исправить ошибку . Пишу свою первую программу в Qt Creator , которая должна...

Undefined reference to `vtable. И еще
Ошибки: tree.cpp:8: ошибка: undefined reference to `vtable for Tree' tree.cpp:66: ошибка:...

Undefined reference to `vtable for MClas'
Обнаглел настолько, что решил попробовать себя в самостоятельном творчестве И получил такую ошибку...

Undefined reference to `vtable for Vim'
Привет всем! пользуесь линуксом...установил qt creator 2.7.2 qt 5.1.0 ... написал самый простой...

13
1442 / 1323 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.07.2013, 10:21 2
Потому, что нужно исходник обработать moc, и заинклудить то, что получиться после moc.
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
01.07.2013, 12:13  [ТС] 3
а как это сделать через creator? или MinGw, например?
0
1442 / 1323 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
01.07.2013, 21:59 4
В HEADERS прописать main.cpp, а в конце main заинклудить main.moc/moc_main.cpp или что там выдаст moc.
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.07.2013, 17:27 5
вынесите в отдельный хедер и срр файлы класс и подключите к проекту, Qt не любит объявления и реализации в срр
2
1442 / 1323 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
02.07.2013, 17:36 6
Цитата Сообщение от l_a_m Посмотреть сообщение
вынесите в отдельный хедер и срр файлы класс и подключите к проекту, Qt не любит объявления и реализации в срр
С чего это он не любит? Дайте пруф.
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.07.2013, 17:38 7
да вариант ТС-а ИМХО чистейший тому прув, да и просто если в срр делать реализацию и потом руками не тыкать носом моку, что бы он явно прошелся по этим файлам - дела не будет.
*по крайней мере в начале 4-й ветки Qt-а так было, может это мои "старческие" забубоны до сих пор имеют место быть...
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
03.07.2013, 14:30  [ТС] 8
да, всё работает, если разбить на хедер и реализацию в отдельном cpp файле. Подскажите пожалуйста, как сгенерировать моc файл в ручную, без криейтера и где он должен сохраняться ( на примере minGW или gcc)
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:32 9
Библиотеки Qt комплектуются программой qmake, которая выполняет все необходимые подготовительные действия, чтобы компиллятор смог нормально собрать проект, в том же MinGW и nmake нет поддрежки ни signals ни slots, однако компиллят.

В общем при возникновении проблемы с vtable чаще всего помогает "Сборка - Очистить все", "Сборка - Запустить qmake"
Ну и дальше уже собирать проект
moc-файл вручную не сделать, точнее можно, но тогда надо внутренности Qt знать от и до, АБСОЛЮТНО

Добавлено через 55 секунд
То что разбиение помогло - это из-за того, что изменилась конфигурация проекта и qmake был вызван автоматически
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
03.07.2013, 19:40  [ТС] 10
я имею в виду как при помощи qmake создать moc для отдельно взятого cpp файла не запуская креатор? Какой командой это делается и какие подводные камни? При ручном перезапуске qmake через креатор по идее мос файлы должны обновляться, но если объявление и определение класса находятся в main, то компилить всё равно отказывается =(
0
416 / 415 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
03.07.2013, 21:38 11
в чем проблема то?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <QtWidgets/QApplication>
#include <QImage>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QtWidgets/QSlider>
#include <QObject>
 
 
class MyBrightness : public QWidget{
Q_OBJECT
private:
    QImage *mImg;
    QLabel *lbl;
public:
    MyBrightness(QWidget *wgt = 0):QWidget(wgt){
        mImg = new QImage(":/MacOs.png");
        lbl = new QLabel;
        QHBoxLayout *hbl = new QHBoxLayout;
        QSlider *slider = new QSlider;
        slider->setMinimum(-150);
        slider->setMaximum(150);
        slider->setPageStep(1);
        QObject::connect(slider,SIGNAL(valueChanged(int)),this,SLOT(MySlot(int)));
        *mImg = mImg->scaled(100,100);
        lbl->setFixedSize(mImg->size());
        hbl->addWidget(slider);
        hbl->addWidget(lbl);
        setLayout(hbl);
    }
 
    QImage brightness(const QImage& imgOrig, int n)
    {
        QImage img = imgOrig;
        qint32 nHeight = img.height();
        qint32 nWidth = img.width();
 
        for(qint32 i = 0; i < nHeight; ++i){
            QRgb *tempLine = reinterpret_cast<QRgb*>(img.scanLine(i));
 
            for(qint32 j = 0; j < nWidth; ++j){
                int r = qRed(*tempLine) + n;
                int g = qGreen(*tempLine) + n;
                int b = qBlue(*tempLine) + n;
                int a = qAlpha(*tempLine);
 
                *tempLine++ = qRgba(r > 255 ? 255 : r < 0 ? 0 : r,
                                    g > 255 ? 255 : g < 0 ? 0 : g,
                                    b > 255 ? 255 : b < 0 ? 0 : b,
                                    a
                                    );
            }
        }
        return *mImg;
    }
 
public slots:
    void MySlot(int n){
        lbl->setPixmap(QPixmap::fromImage(brightness(*mImg,n)));
    }
 
};
 
 
 
int main(int argc, char** argv)
{
    QApplication app(argc,argv);
    MyBrightness b1;
 
    b1.show();
    return app.exec();
}
 
#include "main.moc"
0
1442 / 1323 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
03.07.2013, 22:35 12
Цитата Сообщение от l_a_m Посмотреть сообщение
да вариант ТС-а ИМХО чистейший тому прув, да и просто если в срр делать реализацию и потом руками не тыкать носом моку, что бы он явно прошелся по этим файлам - дела не будет.
*по крайней мере в начале 4-й ветки Qt-а так было, может это мои "старческие" забубоны до сих пор имеют место быть...
Точно? А дока ко moc допускает.
Цитата Сообщение от Kojt Посмотреть сообщение
moc-файл вручную не сделать, точнее можно, но тогда надо внутренности Qt знать от и до, АБСОЛЮТНО
брехня. достаточно почитать доку про moc, и qmake(Customizing Makefile Output)
И в pro дописать что-то типа
Код
mocmain.target = main.moc
mocmain.commands = moc $(DEFINES) $(INCPATH) -i main.cpp -o main.moc
mocmain.depends = main.cpp

PRE_TARGETDEPS += mocmain
Это недостаток убогого qmake, и не имеет никакого отношения к
Цитата Сообщение от l_a_m Посмотреть сообщение
Qt не любит объявления и реализации в срр
0
7 / 7 / 1
Регистрация: 23.02.2013
Сообщений: 24
04.07.2013, 08:06 13
Когда у меня подобные ошибки выскакивают, то я запускаю qmake и все вопросы решаются, тем более в QtCreator запустить qmake для проекта вообще не проблема.
0
1 / 1 / 0
Регистрация: 15.11.2012
Сообщений: 36
08.03.2015, 16:15 14
На версии 4.4.0 помогло именно это, вынос в .h файл. Просто удаление moc и перезапуск qmake непомогал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 16:15
Помогаю со студенческими работами здесь

Ошибка: undefined reference to `vtable for MySlot'
#include &lt;QApplication&gt; #include &lt;QWidget&gt; #include &lt;QObject&gt; #include &lt;QtCore&gt; class MySlot :...

Qt5/CMake undefined reference to 'vtable '
В qmake собирает, а с cmake проблемы. Помогите разобраться. Структура проекта: include src...

Main.cpp:10: ошибка: undefined reference to `vtable for A'
вот такая легкая программа не компилируется: #include &lt;QCoreApplication&gt; #include &lt;QObject&gt;...

Ошибка "undefined reference to'vtable for Triangle'"
Здравствуйте, Показывает на конструктор, не дает запуститься программе. Проблемы: ошибка :...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru