1

を継承するクラスにシグナルを追加したいQGraphicsScene

signals:
    void update(std::vector< std::vector<int> > board);

Q_OBJECTこれを行うと、Qt Creator はマクロを忘れたことを警告します。しかし、どこかで から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

If you have not implemented any class with Q_Object before to the project and you add the Q_OBJECT line yourself, you get the vtable error. If you add another c++ class to the project that inherits from QObject, then you get rid of this problem. You can remove this class you created if you dont need it. I am not sure why this happens, but this is easy way to get rid of the problem. Maybe the creator adds some line to the . pro file when you add a class that inherits from 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 に答える