2015-03-11 4 views
1

Я хочу создать свой собственный виджет, который расширяет QFrame, однако, когда я пытаюсь сделать конструктор, я получаю сообщение об ошибке.Расширение QFrame в пользовательском классе

#ifndef CONTROLFRAME_H 
#define CONTROLFRAME_H 

#include <QObject> 
#include <QFrame> 
#include <QWidget> 
#include <QtGui> 

class ControlFrame : public QFrame 
{ 
    Q_OBJECT 

public: 
    ControlFrame(QWidget *parent = 0); 
    ~ControlFrame(); 

private: 
    QWidget *m_parent; 
}; 

#endif // CONTROLFRAME_H 

и CPP

#include "controlframe.h" 

ControlFrame::ControlFrame(QWidget *parent) 
    : QFrame(parent) 
{ 
    m_parent = parent; 
} 

ControlFrame::~ControlFrame() 
{ 

} 

К сожалению, я получаю следующее сообщение об ошибке

Undefined symbols for architecture x86_64: 
    "vtable for ControlFrame", referenced from: 
     ControlFrame::ControlFrame(QWidget*) in controlframe.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [PFEtest.app/Contents/MacOS/PFEtest] Error 1 
18:54:21: The process "/usr/bin/make" exited with code 2. 
Error while building/deploying project PFEtest (kit: Desktop Qt 5.4.0 clang 64bit) 
When executing step "Make" 

Что я делаю неправильно?

+0

Какую систему сборки вы используете? Вы добавили пропуск MOC в компиляцию? –

+0

@MatteoItalia Я использую новейший Qt Creator для Mac OS X Yosemite, по умолчанию устанавливаем последнюю версию Qt. Помимо этого я понятия не имею, о чем вы просите (прошу простить мое незнание) – dominicbri7

+0

Попробуйте построить чистую и перезагрузив qmake из меню «Построение». – phyatt

ответ

-2

Я думаю, что если вы удалите Q_OBJECT из вашего .h, все будет хорошо. Я не уверен, но поскольку вы наследуете от QFrame, у вас уже есть Q_OBJECT в вашем объекте.

+1

Спасибо, мой друг, ты этого не заслуживаешь, ты не заслуживаешь для ректа - Pashabiceps – dominicbri7

+1

@ dominicbri7 На самом деле это неправильно. Вы должны только опустить 'Q_OBJECT', если можете * четко указать, почему. Обычно это плохая идея. – hyde

+0

hyde является правильным. Вообще говоря, все, что происходит от 'QObject', должно иметь макрос' Q_OBJECT'. Любые обходные пути - это непонимание системы сборки. Этот ** ответ - плохой совет **. –

Смежные вопросы