将信号添加到继承自QGraphicsScene的类

时间:2010-11-10 18:31:08

标签: c++ qt graphics qobject

我想向继承自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

7 个答案:

答案 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文件。