o
ost.vld16 березня 2017 р. 19:12

Qt наследование от класса, если родительский класс является наследником QWidget

наследование

есть код

#ifndef PLOTWQ_H 
#define PLOTWQ_H 

#include <qwidget> 
#include <qvector> 
#include <qlabel> 
#include <qvboxlayout> 
#include <qdoublespinbox> 
#include "qcustomplot.h" 
#include <qcolor> 
#include <qpushbutton> 
#include <qgridlayout> 
#include "classspinbox.h" 

class PlotWQ : public QWidget 
{ 
    Q_OBJECT 
public: 
    PlotWQ(QString Xname, QString Yname, QWidget *parent = 0) : QWidget(parent) 
    { 
        xn =Xname; 
        xm = Yname; 
    } 
protected: 
    QString xn; 
    QString xm; 
}; 
#endif // PLOTWQ_H 

class QCPgraph : public PlotWQ 
{ 
    Q_OBJECT public: QCPgraph() {}; 
    ~QCPgraph() {}; 
}; 


при вызове объекта класса выдает ошибку no matching function for call to <PlotWQ::PlotWQ> {};

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

12
o
  • 16 березня 2017 р. 19:15

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

    Evgenii Legotckoi
    • 16 березня 2017 р. 23:49

    Добрый день ))

    Приведите пример, как именно, вы вызываете объект класса. Я не вижу этого кода. Покажите этот код.

    Само по себе ошибка no matching function for call to часто бывает вызвана тем, что не подключён заголовочный файл в том файле, где вы пытаетесь вызывать класс, методы класса или работать с объектом. То есть в том файле не хватает: #include "plotwq.h"

    P/S/ Используйте для вставки кода в следующий раз специальное диалоговое окно. На тулбаре редактора ответов это кнопочка с иконкой " {} ". И рядом с ней кнопочка предварительного просмотра комментария, если хотите увидеть, как будет отображаться комментарий на сайте.

      o
      • 17 березня 2017 р. 04:52

      Спасибо за ответ, вот код.

      #include "mainwindow.h"
      #include <QApplication>
      
      Main.cpp
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
          MainWindow w;    
          w.showMaximized();
      
          return a.exec();    
      }
      
      mainwindow.h
      #ifndef MAINWINDOW_H
      #define MAINWINDOW_H
      
      #include <QMainWindow>
      #include <QGridLayout>
      #include <QWidget>
      #include <QMenuBar>
      #include <QMenu>
      #include <QToolBar>
      #include <QMessageBox>
      #include <QVector>
      #include <QStandardItemModel>
      #include <QDebug>
      #include <QList>
      #include <QVBoxLayout>
      #include <QTableWidget>
      #include <QProgressDialog>
      #include <QApplication>
      #include <QTabWidget>
      #include <QSize>
      #include <QProgressDialog>
      
      #include "classfileopen.h"
      #include "plotwq.h"
      #include "classmedia.h"
      #include "classspinbox.h"
      #include "tabdialog.h"
      #include "dialog.h"
      #include "classTable.h"
      
      
      class MainWindow : public QMainWindow
      {
          Q_OBJECT
      
      public:
          explicit MainWindow(QWidget *parent = 0):QMainWindow(parent)
          {
      plotAbs = new  QCPgraph (true,"Координата", "Поглощение");
              }
      
      ~MainWindow()
          {
      delete plotAbs;
      }
      
      protected:
          QCPgraph *plotAbs;
      };
      
      
      #endif // MAINWINDOW_H
      
      plotwq.h
      
      #ifndef PLOTWQ_H
      #define PLOTWQ_H
      
      #include <QWidget>
      #include <QVector>
      #include <QVBoxLayout>
      #include "qcustomplot.h"
      #include <QColor>
      
      class PlotWQ : public QWidget
      {
          Q_OBJECT
      public:
          explicit PlotWQ(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
              QWidget(parent)
          {
      xn =Xname; 
              xm = Yname;
            
          }
      protected: 
          QString xn; 
          QString xm;
      
      };
      
      #endif // PLOTWQ_H
      
      class QCPgraph : public PlotWQ 
      { 
          Q_OBJECT 
      public: 
      QCPgraph() {}; 
          ~QCPgraph() {}; 
      };
      
      
      
        Evgenii Legotckoi
        • 17 березня 2017 р. 05:19

        Во-первых: сам файл plotwq.h Нужно располагать весь код между следующими директивами:

        #ifndef PLOTWQ_H
        #define PLOTWQ_H
        // Здесь весь код
        #endif // PLOTWQ_H

        То есть должно выглядеть так:

        #ifndef PLOTWQ_H
        #define PLOTWQ_H
        
        #include <QWidget>
        #include <QVector>
        #include <QVBoxLayout>
        #include "qcustomplot.h"
        #include <QColor>
        
        class PlotWQ : public QWidget
        {
            Q_OBJECT
        public:
            explicit PlotWQ(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                QWidget(parent)
            {
        xn =Xname; 
                xm = Yname;
              
            }
        protected: 
            QString xn; 
            QString xm;
        
        };
        
        
        class QCPgraph : public PlotWQ 
        { 
            Q_OBJECT 
        public: 
        QCPgraph() {}; 
            ~QCPgraph() {}; 
        };
        
        #endif // PLOTWQ_H

        Во-вторых: правильно, что ругается на конструктор. Вы используете объект следующим образом:

        plotAbs = new  QCPgraph (true,"Координата", "Поглощение");

        А в самом классе такого конструктора нет

        class QCPgraph : public PlotWQ 
        { 
            Q_OBJECT 
        public: 
        QCPgraph() {};   // Это не работает в данной ситуации
            ~QCPgraph() {}; 
        };

        Нужно написать соответствующий конструктор:

        explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                PlotWQ(leg,Xname, Yname,  parent)
            {
            }
          Evgenii Legotckoi
          • 17 березня 2017 р. 05:39

          И к слову говоря... Кто вообще так наследует классы?

          QCPGraph - это файл библиотеки QCustomPlot, а получается, что вы его переопределяете и наследуете от класса, который был наследован от QWidget . Абсолютно не правильно.

          Если вы хотели наледоваться от этого класса, то нужно всё делать в точности до наоборот.

          class PlotWQ : public QCPgraph 
          { 
              Q_OBJECT 
          public: 
          explicit PlotWQ(bool leg,QString Xname, QString Yname) :
                  QCPgraph()
              {
              }
              ~PlotWQ() {}; 
          };

          Нельзя наследовать уже существующий класс от другого класса.

            o
            • 17 березня 2017 р. 14:59
            • Відповідь була позначена як рішення.

            По поводу QCPgraph, это случайное совпадение. От QCustomPlot наследоваться не хотел. Спасибо за объяснения. Заработало. main.cpp

            #include "mainwindow.h"
            #include <QApplication>
            
            int main(int argc, char *argv[])
            {
                QApplication a(argc, argv);
                MainWindow w;
                w.show();
            
                return a.exec();
            }
            
            mainwindow.h
            #ifndef MAINWINDOW_H
            #define MAINWINDOW_H
            
            #include <QMainWindow>
            #include <QGridLayout>
            #include <QWidget>
            #include <QMenuBar>
            #include <QMenu>
            #include <QToolBar>
            #include <QMessageBox>
            #include <QVector>
            #include <QStandardItemModel>
            #include <QDebug>
            #include <QList>
            #include <QVBoxLayout>
            #include <QTableWidget>
            #include <QProgressDialog>
            #include <QApplication>
            #include <QTabWidget>
            #include <QSize>
            #include <QProgressDialog>
            
            #include "plotwq.h"
            
            class MainWindow : public QMainWindow
            {
                Q_OBJECT
            
            public:
                explicit MainWindow(QWidget *parent = 0):QMainWindow(parent)
                {
                    plotAbs = new  QCPgraph (true,"Координата", "Поглощение");
                    plotAbs->setMinimun(-5);
                }
            
                ~MainWindow()
                {
                    delete plotAbs;
                }
            
            protected:
                QCPgraph *plotAbs;
            
            };
            
            #endif // MAINWINDOW_H
            
            plotwq.h
            #ifndef PLOTWQ_H
            #define PLOTWQ_H
            
            #include <QWidget>
            #include <QString>
            class PlotWQ : public QWidget
            {
                Q_OBJECT
            
            public:
                explicit PlotWQ(bool leg,QString Xname, QString Yname,QWidget *parent = 0) :
                    QWidget(parent)
                {
                    xn =Xname;
                    xm = Yname;
                }
                ~PlotWQ()
                {
            
                }
            protected:
                QString xn;
                QString xm;
            
            };
            
            
            class QCPgraph : public PlotWQ
            {
                Q_OBJECT
            public:
                explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                        PlotWQ(leg,Xname, Yname,  parent)
                    {
                    xn =Xname;
                    xm = Yname;
                    }
                void setMinimun(int arg)
                {
                    min=arg;
                }
            
                ~QCPgraph()
                {
            
                }
            protected:
                QString xn;
                QString xm;
                double min;
            };
            #endif // PLOTWQ_H
            
              Evgenii Legotckoi
              • 17 березня 2017 р. 15:50

              Ну хорошо, что заработало. Но есть ещё замечания по этому коду.

              class QCPgraph : public PlotWQ
              {
                  Q_OBJECT
              public:
                  explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                          PlotWQ(leg,Xname, Yname,  parent)
                      {
                     xn =Xname;    // Это не нужноxm = Yname;   // Это тоже не нужно
                      }
                  void setMinimun(int arg)
                  {
                      min=arg;
                  }
              
                  ~QCPgraph()
                  {
              
                  }
              protected:
                  QString xn;
                  QString xm;
                  double min;
              };
              #endif // PLOTWQ_H

              Переменные xn и xm в конструкторе класса QCPgraph присваивать не нужно. Поскольку они уже присваиваются в конструкторе PlotWQ . Почему? Потому, что Вы его вызываете в конструкторе QCPgraph.

              explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                          PlotWQ(leg,Xname, Yname,  parent)    // Именно в этом месте вызывается конструктор PlotWQ, в котором уже всё и присваивается.
                      {
                      }

              При работе с Qt есть одна интересная фишка. Все классы, наследованные от QObject могут иметь некий parent. Что позволяет не удалять в ручную объекты в деструкторе. Qt следит, чтобы при уничтожении, родитель удалял все child объекты

              ~MainWindow()
                  {
              delete plotAbs; // Это будет не нужно
              }

              Если написать так

              plotAbs = new  QCPgraph (true,"Координата", "Поглощение", this);

              То есть MainWindow будет в качестве parent объекта для plotAbs и при удалении автоматически удалит из кучи и plotAbs

                o
                • 17 березня 2017 р. 18:27

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

                explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                            PlotWQ(parent)
                        {
                        xn =Xname;
                        xm = Yname;
                        }

                видимо забыл удалить leg,Xname, Yname из PlotWQ(leg,Xname, Yname, parent)
                про деструктор не знал, спасибо)
                  Evgenii Legotckoi
                  • 18 березня 2017 р. 00:44

                  Вам эта привычка в крупном проекте боком выйдет )))

                  В том проекте, над которым я работаю в команде (примерно 1,5 ГБ исходных текстов), такое даже код ревью не прошло бы. К тому же Вы таким образом ограничиваете себя в использовании возможностей С++.

                    o
                    • 18 березня 2017 р. 04:42

                    А в чем недостатки моего метода?

                      Evgenii Legotckoi
                      • 18 березня 2017 р. 05:18

                      Если говорить конкретно про следующий код:

                      explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                                  PlotWQ(parent)
                              {
                              xn =Xname;
                              xm = Yname;
                              }

                      То тут вроде бы и нет никакой особой проблемы, если не знать, есть ли альтернативные конструкторы у PlotWQ . Тем не менее, даже здесь стоит переписать несколько иначе. Поскольку кроме присваивания xn и xm Вы ничего больше не делаете. У нас бы написали так:

                      explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                                  PlotWQ(parent),
                                  xn(Xname),
                                  xm(Yname)
                              {
                              }

                      В данном случае инициализация будет делаться только в порядке, как объявлены переменные в классе. В деструкторе переменные должны будут удаляться в обратном порядке. Это влияет на выделяемую память. В случае сложных объектов могут быть проблемы.

                      Если же есть альтернативные конструкторы. То тут будет зависеть от ситуации.

                      Например, в следующей ситуации значения переменным будут присваиваться дважды, сначала в конструкторе базового класса PlotWQ , а потом уже в самом классе QCPgraph .

                      explicit QCPgraph(bool leg,QString Xname, QString Yname, QWidget *parent = 0) :
                                  PlotWQ(leg,Xname, Yname,  parent)
                              {
                              xn =Xname;    
                              xm = Yname;
                              }

                      Некоторые моменты конечно могут показаться субъективными, но тем не менее это повысит качество кода.

                        o
                        • 19 березня 2017 р. 09:18

                        ясно. спасибо.

                          Коментарі

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          AD

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:50бали,
                          • Рейтинг балів-4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 01:37

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:80бали,
                          • Рейтинг балів4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 01:29

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:20бали,
                          • Рейтинг балів-10
                          Останні коментарі
                          ИМ
                          Игорь Максимов22 листопада 2024 р. 11:51
                          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii Legotckoi31 жовтня 2024 р. 14:37
                          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZE19 жовтня 2024 р. 08:19
                          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов05 жовтня 2024 р. 07:51
                          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas505 липня 2024 р. 11:02
                          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Тепер обговоріть на форумі
                          Evgenii Legotckoi
                          Evgenii Legotckoi24 червня 2024 р. 15:11
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey115 листопада 2024 р. 06:04
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProject04 червня 2022 р. 03:49
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                          9
                          9Anonim25 жовтня 2024 р. 09:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                          Слідкуйте за нами в соціальних мережах