2010-11-10 67 views
0

继承我想一个信号添加到从QGraphicsScene继承的类。添加信号类,从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 

回答

1

根据要求重新邮寄为答案:

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

2

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

+0

所以我应该可以添加宏吗?如果我这样做,我会得到这些编译器错误:http:// img29。imageshack.us/img29/7995/errorsv.jpg什么是vtable? – Pieter 2010-11-10 19:02:21

+0

我做了一些研究......如果vtable出现错误,那么运行时绑定必然会出错。 – Pieter 2010-11-10 19:12:01

+2

确保在进行此类更改后进行全面清理并重建。我曾经看到QtCreator在错误地缓存了一些关于什么有信号和什么没有信号的旧信息时会感到困惑。另外,请确保.pro文件的标题部分是正确的,并研究moc的行为如何确保您的.pro文件能够满足需要。 – wrosecrans 2010-11-10 19:12:13

1

V表必须是与虚函数。当你有一个像Undefined reference to vtable这样的错误时,它不能找到一个虚拟函数的实现(我认为)。你有没有实现你的所有功能?也许你不应该使用关键字virtual?或相反亦然?

而且,你说你要添加的信号,但你的代码块显示了一个插槽?你能否再多展示一下你的班级?

+0

未定义的引用gcc中的vtable错误的确是最常见的原因是缺少类中虚拟函数的实现。 – rubenvb 2010-11-10 19:27:33

+0

哎呀,是的,我确实打算使用信号。尽管如此,我仍然遇到同样的错误。我将类的头文件添加到我的问题中。 – Pieter 2010-11-10 19:38:14

+0

尝试改变'信号:''到私人信号:'或'公共信号:取决于'如果你想在'update'信号是公开与否。虽然,我认为它可能只是从上面继承了'private:'。 – NeilMonday 2010-11-10 21:05:10

0

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

+0

尾随“;”是无用的,并会根据您的编译器给出警告。 – 2010-11-11 07:05:19

+0

是的,我在'boardgui.cpp'中实现了析构函数。 – Pieter 2010-11-11 09:16:34

0

您是否已将boardgui.h添加到MOC预处理器的文件列表中?任何使用QObject和信号/插槽的类都需要通过元对象编译器传递,以便它可以生成信号背后的实际代码。

我不确定如果Qt Creator的自动处理此。

+0

我认为它会自动处理。从文档:*除了最简单的测试程序之外,建议您自动运行moc。通过在程序的makefile中添加一些规则,make可以在必要时处理moc,并处理moc输出。我们建议使用qmake makefile生成工具来构建makefile。这个工具会生成一个makefile来完成所有必要的moc处理。* – Pieter 2010-11-11 10:37:11

+0

@Pieter有趣。这是否包括根据其内容确定哪些头文件实际需要MOC生成?或者它只是MOC他们所有?我使用CMake生成我的构建文件,我可以调用MOC宏,但我仍然需要将它们传递给需要MOC生成的头文件列表 – badgerr 2010-11-11 13:06:37

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的处理。

0

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