Расширение 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"

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


person dominicbri7    schedule 11.03.2015    source источник
comment
Какую систему сборки вы используете? Вы добавляли проход MOC в компиляцию?   -  person Matteo Italia    schedule 11.03.2015
comment
@MatteoItalia Я использую последнюю версию Qt Creator в Mac OS X Yosemite, по умолчанию устанавливается последняя версия Qt. Кроме этого, я понятия не имею, о чем вы просите (простите за невежество)   -  person dominicbri7    schedule 11.03.2015
comment
Попробуйте выполнить чистую сборку и перезапустите qmake из меню «Сборка».   -  person phyatt    schedule 11.03.2015
comment
Кроме всего прочего, вам действительно не нужно m_parent. Просто используйте QObject::parent(). Я думаю, вам следует прочитать полный API QObject, QWidget и QFrame, чтобы понять, что там. Да, я знаю, это безумная идея, но вам действительно нужно прочитать все, от начала до конца. Как еще вы узнаете о какой-либо функциональности, которая там может быть?   -  person Kuba hasn't forgotten Monica    schedule 11.03.2015
comment
@KubaOber m_parent взят из примера, который я читал в Интернете, но даже если я удалю его, я все равно получаю эту ошибку.   -  person dominicbri7    schedule 11.03.2015
comment
Все, что я хочу, это создать очень простой класс, расширяющий QFrame, все, что я пробую, терпит неудачу.   -  person dominicbri7    schedule 11.03.2015
comment
Правильное решение - повторно запустить qmake, а затем выполнить чистую сборку (например, из меню сборки Qt Creator). Если это не помогает, убедитесь, что оба файла .cpp и .h указаны в файле .pro для qmake.   -  person hyde    schedule 11.03.2015
comment
@hyde неверно. Я пробовал, не работает, он уже указан в файле .pro. Чистая сборка ничего не исправляет   -  person dominicbri7    schedule 12.03.2015
comment
@ dominicbri7 Тогда вероятная причина в том, что вы создали исходный каталог (либо из командной строки, либо из Qt Creator с снятым флажком теневой сборки). Затем вы переключились на создание теней. В этом случае у вас есть устаревшие файлы moc_ . (и, возможно, ui _ *. H) в исходном каталоге. Удалите их, затем попробуйте построить снова.   -  person hyde    schedule 12.03.2015


Ответы (1)


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

person simperreault    schedule 11.03.2015
comment
Спасибо, мой друг, ты этого не заслуживаешь, ты не заслуживаешь rekt - Pashabiceps - person dominicbri7; 11.03.2015
comment
@ dominicbri7 На самом деле это неправильно. Вам следует опускать Q_OBJECT только в том случае, если вы можете четко указать, почему. Обычно это плохая идея. - person hyde; 11.03.2015
comment
Хайд прав. Вообще говоря, все, что происходит от QObject, должно иметь макрос Q_OBJECT. Любые обходные пути возникают из-за непонимания системы сборки. Это плохой совет. - person Kuba hasn't forgotten Monica; 11.03.2015
comment
это ЕДИНСТВЕННЫЙ ответ, который устранил мою проблему. У меня больше нет ошибок компиляции. Макрос Q_OBJECT работает в моих классах, расширяющих QObject, но этот класс, расширяющий QFrame, не работает с Q_OBJECT, он дает мне ошибку компиляции, упомянутую в вопросе. - person dominicbri7; 12.03.2015
comment
Мне кажется, что у включенных классов уже есть Q_OBJECT, и его повторное использование испортило vtable (что кажется в журнале ошибок). С Q_OBJECT моя сборка терпит неудачу (да, я пробовал чистую перестройку) БЕЗ Q_OBJECT все работает - person dominicbri7; 12.03.2015