Добавление сигналов в класс, которые наследуются от QGraphicsScene - PullRequest
0 голосов
/ 10 ноября 2010

Я хочу добавить сигнал в класс, который наследуется от 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 ]

2 голосов
/ 10 ноября 2010

QGraphicsScene наследуется от QObject. Вы можете ознакомиться с документацией. http://doc.qt.io/qt-5/qgraphicsscene.html

1 голос
/ 12 ноября 2010

Повторная отправка в ответ на запрос:

Является ли update () вашим сигналом?Вы пытались реализовать сигнал самостоятельно?Если да, не делайте этого, сигналы определяются moc.

1 голос
/ 10 ноября 2010

Vtables как-то связаны с виртуальными функциями. Когда у вас появляется ошибка типа Undefined reference to vtable, тогда она не может найти реализацию для виртуальной функции (я думаю). Вы реализовали все свои функции? Может быть, вы использовали ключевое слово virtual, когда не предполагали? Или наоборот?

Кроме того, вы говорите, что хотите добавить сигнал, но ваш фрагмент кода показывает слот? Не могли бы вы показать немного больше своего класса?

0 голосов
/ 15 июля 2012

Если вы ранее не реализовали какой-либо класс с Q_Object в проекте и добавили строку Q_OBJECT самостоятельно, вы получите ошибку vtable.Если вы добавите в проект другой класс c ++, который наследуется от QObject, то вы избавитесь от этой проблемы.Вы можете удалить этот класс, который вы создали, если он вам не нужен.Я не уверен, почему это происходит, но это простой способ избавиться от проблемы.Может быть, создатель добавляет какую-то строку в.pro-файл при добавлении класса, который наследуется от qobject.

0 голосов
/ 11 ноября 2010

Вы просто должны унаследовать от 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 голосов
/ 11 ноября 2010

Вы добавили boardgui.h в список файлов препроцессора MOC?Любой класс, который использует QObject и Signals / Slots, должен быть пропущен через мета-объектный компилятор, чтобы он мог генерировать реальный код за сигналами.

Я не уверен, обрабатывает ли это Qt Creator автоматически.

0 голосов
/ 11 ноября 2010

Вы реализовали свой деструктор? Если нет, попробуйте изменить ~BoardGUI(); на ~BoardGUI(){};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...