2010-11-10 119 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繼承的類。