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 г. 4: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 г. 5: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 г. 5: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 г. 0:44

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

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

                    o
                    • 18 марта 2017 г. 4:42

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

                      Evgenii Legotckoi
                      • 18 марта 2017 г. 5: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 г. 9:18

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

                          Комментарии

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

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

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

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

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

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

                          • Результат:20баллов,
                          • Очки рейтинга-10
                          Последние комментарии
                          i
                          innorwall14 ноября 2024 г. 11:42
                          Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                          i
                          innorwall14 ноября 2024 г. 9:09
                          Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                          i
                          innorwall14 ноября 2024 г. 4:05
                          EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                          i
                          innorwall14 ноября 2024 г. 4:00
                          PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
                          Сейчас обсуждают на форуме
                          i
                          innorwall14 ноября 2024 г. 3:39
                          добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                          i
                          innorwall11 ноября 2024 г. 10:55
                          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                          9
                          9Anonim25 октября 2024 г. 9:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                          ИМ
                          Игорь Максимов3 октября 2024 г. 4:05
                          Реализация навигации по разделам Спасибо Евгений!

                          Следите за нами в социальных сетях