P
PeknicOct. 11, 2016, 4:05 p.m.

Присвоение классу параметра

QGraphicItem, scene, наследование

Здравствуйте. С похожим вопросом обращался, но не допер. На картинке слева класс Plane, и унаследованные от него классы Have, Satellite и пр. Они изображены на сцене. Необходимо в сцену добавить линию, соединяющей объекты как на рисунке (количество линий и объектов может изменяться).
Справа на фото код, попытка реализации. Возвращаю список объектов класса Plane на сцене и хочу проверить их как раз на наличие такого параметра, который и будет указывать с кем провести линию
Ввёл переменную NumberClass в классе Plane и присвоил ей значение 1, и пытался изменить ее значение в унаследованных классах (например в Have изменил ещё на 2), но в возвращаемом списке объектов Plane всем объектам возвращалась 1.
Есть вариант присвоить переменную только унаследованным классам, но тогда придётся отдельно создавать список объектов на сцене по каждому такому классу, а это не очень удобно.
Так вот, каким способом в классе Plane задать параметр, а потом изменить его в унаследованных классах, так чтобы потом в списке объектов на сцене объектам возвращались свои измененные значения?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

5
Evgenii Legotckoi
  • Oct. 12, 2016, 9:53 a.m.

Добрый день.

На словах всё верно сказано, есть базовый класс, у которого есть метод, который вернёт тип объекта. А в наследованных классах данный тип или номер будет переопределён. Лучше это конечно не публичной переменной делать, а через метод, а переменная должна быть приватной. Ну и с проверкой идея правильная.

Но нужно смотреть реализацию самих классов. Или не правильно в конструкторе тип инициализируется, или где Вы там его инициализируете. Или ещё что-то не так идёт.

    P
    • Oct. 13, 2016, 10:35 a.m.

    Реализация такая, но переопределения нет. Думаю в конструктора класса должно типо такого:
    Nave::Nave(Plane *parent)
    {
    NumberClass = 2;
    }
    Но так тоже не работает. Думаю в метод getNumberClass должен отправляться параметр.
    Plane:: getNumberClass(x)
    {
    NumberClass = x;
    return NumberClass;
    }

      Evgenii Legotckoi
      • Oct. 14, 2016, 12:48 a.m.
      • The answer was marked as a solution.

      getNumberClass(x) Будет возвращать лишь то, что Вы ему передаёте. Конечно, это не будет работать.
      Если я правильно понимаю, то возвращать нужно тип объекта, который будет неким номером. Я бы сделал это следующим образом: Имеется некий базовый класс, у которого есть метод, который возвращает тип класса. Этот метод необязательно реализовывать в базовом классе, можно объявить его виртуальным без реализации. И обязательно реализовывать в наследниках. У каждого наследника реализовать данный метод так, чтобы он возвращал собственный тип класса.

      BaseClass.h

      #ifndef BASECLASS_H
      #define BASECLASS_H
       
      #include <QObject>
       
      class BaseClass : public QObject
      {
          Q_OBJECT
       
      public:
       
          enum Types
          {
              FirstType = 0,
              SecondType
          };
       
          explicit BaseClass(QObject *parent = 0);
       
          virtual Types getType() = 0;
       
      signals:
       
      public slots:
      };
       
      #endif // BASECLASS_H

      BaseClass.cpp

      #include "baseclass.h"
       
      BaseClass::BaseClass(QObject *parent) : QObject(parent)
      {
       
      }

      Ну а далее наследники

      FirstClass.h

      #ifndef FIRSTCLASS_H
      #define FIRSTCLASS_H
       
      #include "baseclass.h"
       
       
      class FirstClass : public BaseClass
      {
      public:
          FirstClass();
       
          virtual Types getType() override;
      };
       
      #endif // FIRSTCLASS_H

      FisrtClass.cpp

      #include "firstclass.h"
       
      FirstClass::FirstClass()
      {
       
      }
       
      BaseClass::Types FirstClass::getType()
      {
          return BaseClass::FirstType;
      }

      SecondClass.h

      #ifndef SECONDCLASS_H
      #define SECONDCLASS_H
       
      #include "baseclass.h"
       
      class SecondClass : public BaseClass
      {
      public:
          SecondClass();
       
          virtual Types getType() override;
      };
       
      #endif // SECONDCLASS_H

      SecondClass.cpp

      #include "secondclass.h"
       
      SecondClass::SecondClass()
      {
       
      }
       
      BaseClass::Types SecondClass::getType()
      {
          return BaseClass::SecondType;
      }

      Ну и можно это в MainWindow проверить

      #include "mainwindow.h"
      #include "ui_mainwindow.h"
       
      #include "firstclass.h"
      #include "secondclass.h"
       
      #include <QDebug>
       
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
       
          FirstClass first;
          SecondClass second;
       
          qDebug() << first.getType();
          qDebug() << second.getType();
      }
       
      MainWindow::~MainWindow()
      {
          delete ui;
      }

      В результате вывод qDebug() будет 0 и 1

        P
        • Oct. 21, 2016, 6:19 a.m.
        Спасибо! Все отлично работает. Но теперь проблема возникла при выводе item_1, item_2 в qDebug.
        Ambiguous overload for ‘operator <<‘ (operand types are ‘QDebud’ and ‘AllObject’)
          Evgenii Legotckoi
          • Oct. 21, 2016, 9:21 a.m.

          Вывод qDebug(), а точнее ‘operator <<' класса qDebug() не поддерживает вывод для вашего самопального класса. qDebug() так-то и не обязано поддерживать информацию обо всех классах, только то, что относится к классам Qt и стандартным типам данных.

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            e
            • ehot
            • March 31, 2024, 9:29 p.m.

            C++ - Тест 003. Условия и циклы

            • Result:78points,
            • Rating points2
            B

            C++ - Test 002. Constants

            • Result:16points,
            • Rating points-10
            B

            C++ - Test 001. The first program and data types

            • Result:46points,
            • Rating points-6
            Last comments
            k
            kmssrFeb. 9, 2024, 2:43 a.m.
            Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVADec. 25, 2023, 6:30 p.m.
            Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJoDec. 25, 2023, 4:38 p.m.
            Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            GvozdikDec. 19, 2023, 5:01 a.m.
            Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Now discuss on the forum
            a
            a_vlasovApril 14, 2024, 1:41 p.m.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
            Павел Дорофеев
            Павел ДорофеевApril 14, 2024, 9:35 a.m.
            QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
            f
            fastrexApril 4, 2024, 11:47 a.m.
            Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
            AC
            Alexandru CodreanuJan. 19, 2024, 7:57 p.m.
            QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

            Follow us in social networks