我想向继承自QGraphicsScene
。
signals:
void update(std::vector< std::vector<int> > board);
当我这样做时,Qt Creator警告我忘记了Q_OBJECT
宏。但在某处我读到,因为QGraphicsScene
不从QObject
继承,我不应该把它放在我的类定义中。但信号需要这个宏。
如何向不继承QObject
?
boardgui.h
#ifndef BOARDGUI_H
#define BOARDGUI_H
#include <QGraphicsView>
#include <QGraphicsScene>
class BoardGUI : public QGraphicsScene
{
Q_OBJECT
public:
BoardGUI(QGraphicsView*& view, int dimension);
~BoardGUI();
void buildBoard();
signals:
void update(std::vector< std::vector<int> > board);
private:
int dimension;
QGraphicsView* view;
};
#endif // BOARDGUI_H
答案 0 :(得分:2)
QGraphicsScene继承自QObject。您可以参考文档。 http://doc.qt.io/qt-5/qgraphicsscene.html
答案 1 :(得分:1)
Vtables与虚拟功能有关。当您遇到类似Undefined reference to vtable
的错误时,它无法找到虚拟函数的实现(我认为)。你实现了所有功能吗?也许你不应该使用virtual
关键字?反之亦然?
另外,你说你想添加一个信号,但是你的代码块显示了一个插槽?你能展示一下你的课程吗?
答案 2 :(得分:1)
根据要求重新作为答案:
更新()是你的信号吗?你是否尝试过自己实施这个信号?如果是,请不要这样做,信号由moc定义。
答案 3 :(得分:0)
你有没有实现你的析构函数?如果没有,请尝试将~BoardGUI();
更改为~BoardGUI(){};
答案 4 :(得分:0)
您是否已将boardgui.h添加到MOC预处理器的文件列表中?任何使用QObject和Signals / Slots的类都需要通过元对象编译器传递,以便它可以生成信号背后的实际代码。
我不确定Qt Creator是否自动处理此问题。
答案 5 :(得分:0)
您只需自己继承QObject
。
<强> boardgui.h 强>
#ifndef BOARDGUI_H
#define BOARDGUI_H
#include <QGraphicsView>
#include <QGraphicsScene>
class BoardGUI : public QObject, public QGraphicsScene
{
Q_OBJECT
public:
BoardGUI(QGraphicsView*& view, int dimension);
~BoardGUI();
void buildBoard();
signals:
void update(std::vector< std::vector<int> > board);
private:
int dimension;
QGraphicsView* view;
};
#endif // BOARDGUI_H
如果您使用 Qt Creator ,则不必担心moc,所有内容都应由 Qt Creator 处理。
答案 6 :(得分:0)
如果您之前没有在项目中实现任何带有Q_Object的类,并且您自己添加了Q_OBJECT行,则会出现vtable错误。如果将另一个c ++类添加到继承自QObject的项目中,那么就可以解决这个问题。如果您不需要,可以删除您创建的这个类。我不确定为什么会这样,但这是摆脱问题的简单方法。也许创作者添加了一些线条。添加从qobject继承的类时的pro文件。