f
June 4, 2018, 12:24 a.m.

Вызов сигнала в 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

Do you like it? Share on social networks!

5
Evgenii Legotckoi
  • June 4, 2018, 1:16 p.m.

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

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

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

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

    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
      • June 4, 2018, 4:23 p.m.
      • (edited)
      • The answer was marked as a solution.

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


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

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

          f
          • June 4, 2018, 6:53 p.m.

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

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            • Last comments
            • Evgenii Legotckoi
              April 16, 2025, 5:08 p.m.
              Благодарю за отзыв. И вам желаю всяческих успехов!
            • IscanderChe
              April 12, 2025, 5:12 p.m.
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              April 1, 2025, 11:41 a.m.
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              March 9, 2025, 9:02 p.m.
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              March 9, 2025, 4:14 p.m.
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…