f
4 июня 2018 г. 0:24

Вызов сигнала в mousePressEvent

c++, qt, QGraphicItem

родитель:
// абстрактный класс
class NodeEdgeParent : public QGraphicsItem
{
public:
    NodeEdgeParent(GraphWidget *graphWidget);
    enum { Type = UserType + 1 };
    virtual void setTextContent(QString text) = 0;
    virtual QString textContent() const = 0;
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
    GraphWidget *graph;
};
2 дочерних класса:
class Node : public NodeEdgeParent
class Edge : public NodeEdgeParent
Почему я не могу обратиться в NodeEdgeParent::mousePressEvent к полю graph ?
nodeedgeparent.cpp
#include "nodeedgeparent.h"
#include <QDebug>
class GraphWidget;

NodeEdgeParent::NodeEdgeParent(GraphWidget *graphWidget): graph(graphWidget)
{

}

void NodeEdgeParent::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if (event->button() == Qt::RightButton) {
        qDebug() << "RightButton";
        scene()->clearSelection();
        setSelected(true);
//        emit graph->editItem();
    }
    QGraphicsItem::mousePressEvent(event);
}

Весь проект лежит на github . Задача состоит что бы при нажатии ПКМ на вершине или на дуге вызывался сигнал graph->editItem().
2

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 4 июня 2018 г. 13:16

Мне не нравится то, что у вас имя базового класса и имя поля одинаковые.

Это может вызывать проблемы при компиляции. Переназовите, пожалуйста, поле с имени graph на m_graph, например.
Наверняка конфликт имён.

P/S/ с работы мне к сожалению не с руки собирать ваш проект, чтобы проверить что там не так.
    f
    • 4 июня 2018 г. 16:11

    переименовал. Но все равно, Выводит вот такие ошибки:

    C:\Users\q\Documents\QT Project\elasticnodes\nodeedgeparent.cpp:-1: In member function 'virtual void NodeEdgeParent::mousePressEvent(QGraphicsSceneMouseEvent*)':
    C:\Users\q\Documents\QT Project\elasticnodes\nodeedgeparent.cpp:16: ошибка: invalid use of incomplete type 'class GraphWidget'
    emit m_graph->editItem();
    ^
    C:\Users\q\Documents\QT Project\elasticnodes\nodeedgeparent.cpp:1: In file included from ..\elasticnodes\nodeedgeparent.cpp:1:0:
    C:\Users\q\Documents\QT Project\elasticnodes\nodeedgeparent.h:10: forward declaration of 'class GraphWidget'
    class GraphWidget;
    ^
    Еще вопрос: может ли класс, который не наследуется от QObject  вызывать прерывание? Тут есть какие то нюансы?

      Evgenii Legotckoi
      • 4 июня 2018 г. 16:23
      • (ред.)
      • Ответ был помечен как решение.

      хм. так у вас нет заголовочного файла для GraphWidget. я что-то не обратил внимания на это, пока описание ошибки не кинули.


      У вас в файле реализации добавлено class GraphWidget - а это forward declaration, чаще всего его используют в заголовочном файле, а не в файле реализации. Перекиньте его в заголовочный файл, а в файле cpp дайте инклюд заголовочного файла этого самого класса GraphWidget.
        Evgenii Legotckoi
        • 4 июня 2018 г. 16:29

        Я вообще что-то неправильно понял код поначалу

          f
          • 4 июня 2018 г. 18:53

          да, помогло, я думал раз я написал: class GraphWidget; так хидер файл можно не добавлять

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь