1

我想将信号添加到继承自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
4

7 回答 7

2

QGraphicsScene 确实继承自 QObject。您可以查阅文档。 http://doc.qt.io/qt-5/qgraphicsscene.html

于 2010-11-10T18:51:21.267 回答
2

根据要求重新发布为答案:

update() 是你的信号吗?您是否尝试自己实现信号?如果是,请不要这样做,信号由 moc 定义。

于 2010-11-12T11:17:41.167 回答
1

Vtables 与虚函数有关。当您遇到这样的错误时,Undefined reference to vtable它无法找到虚函数的实现(我认为)。你实现了所有的功能吗?也许您virtual在不应该使用的时候使用了关键字?或相反亦然?

另外,你说你想添加一个信号,但是你的代码块显示了一个槽?你能多展示一点你的课吗?

于 2010-11-10T19:19:55.363 回答
1

如果您之前没有在项目中使用 Q_Object 实现任何类并且您自己添加了 Q_OBJECT 行,则会收到 vtable 错误。如果您将另一个 c++ 类添加到从 QObject 继承的项目中,那么您就可以摆脱这个问题。如果您不需要它,您可以删除您创建的此类。我不确定为什么会发生这种情况,但这是解决问题的简单方法。也许创作者在 . pro 文件,当您添加一个继承自 qobject 的类时。

于 2012-07-15T11:17:38.623 回答
0

你实现了你的析构函数吗?如果没有,请尝试更改~BoardGUI();~BoardGUI(){};

于 2010-11-10T21:13:20.540 回答
0

您是否已将 boardgui.h 添加到 MOC 预处理器的文件列表中?任何使用 QObject 和 Signals/Slots 的类都需要通过 Meta-Object Compiler,以便它可以生成信号背后的实际代码。

我不确定 Qt Creator 是否会自动处理这个问题。

于 2010-11-11T10:26:26.440 回答
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处理。

于 2010-11-11T10:57:24.473 回答