Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    No Appropriate Default Constructor -- Help Please??

    General and Desktop
    4
    8
    12358
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      AngelMacias last edited by

      Hello QtProject again,

      I've been posting here for the past month now as I have been working on a school project for the last month asking for help(which I greatly appreciate the help from you fine folk). Anyways, to the error:

      @error: C2512: 'Ui::GuiDialog' : no appropriate default constructor available

      error: C1903: unable to recover from previous error(s); stopping compilation@

      Here is my header file and snippet of my code:

      GuiDialog.h
      @#ifndef GUIDIALOG_H
      #define GUIDIALOG_H

      #include <QObject>
      #include <QtGui>
      #include <QDialog>
      #include <QLabel>
      #include "Dealer.h"
      #include "Player.h"
      #include "GameModel.h"

      namespace Ui
      {
      class GuiDialog;
      }

      class GuiDialog: public QDialog
      {
      Q_OBJECT

      public:
      GuiDialog(QWidget *parent=0);
      GuiDialog(QWidget *, GameModel *);
      ~GuiDialog();
      public slots:
      void updateCard(int, int);
      void newScore(int);
      void endGame();
      void playerWon();
      void dealerWon();
      void tie();
      void updatePlayerThirdCard();
      void updateDealerThirdCard();
      private:
      GameModel *model;
      Ui::GuiDialog *ui;
      QLabel *playerCards, *dealerCards, *displayWinner;
      QPushButton *betButton;
      QLCDNumber *number;
      int score;

      };

      #endif // GUIDIALOG_H@

      GuiDialog.cpp
      @#include "GuiDialog.h"
      #include "GameModel.h"
      #include <QDialog>
      #include <QtGui>
      #include <QPixmap>
      #include <QLabel>
      #include <QtGlobal>

      /*****************************************
      /* This class will implement the changes
      /* taking place in the GUI such as updating
      /* the cards being displayed
      /*****************************************/

      GuiDialog::GuiDialog(QWidget *parent) : QDialog(parent), ui(new Ui::GuiDialog) //<----error takes me to this line
      {
      ui->setupUi(this);
      }

      GuiDialog::GuiDialog(QWidget *parent, GameModel *model): QDialog(parent), ui(new Ui::GuiDialog)
      {
      betButton = new QPushButton(tr("&Bet"));

      QSpinBox *spinBox = new QSpinBox;
      QSlider *slider = new QSlider(Qt::Horizontal);
      spinBox->setRange(0, 100000);
      slider->setRange(0, 100000);
      
      QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                       slider, SLOT(setValue(int)));
      QObject::connect(slider, SIGNAL(valueChanged(int)),
                       spinBox, SLOT(setValue(int)));
      
      /**/@
      

      I've searched at the Qt-Project forums for help as well as google for solutions. Sadly, I could not really find anything here and google only showed me results of C++ programs not involving Qt. I understand that the compiler is not reading my default constructor that's why it refuses to compile, but I thought that first set of lines in GuiDialog.cpp(where the error takes me) is the default constructor? Granted, I am a student barely learning this and I merely copied the syntax of brand new "MainWindow" project in hopes that it would work. But apart from that, I really want to know what constitutes a default constructor such that the first lines of my GuiDialog.cpp do not make it the default constructor as I thought it would be?

      Thank you for your help and time.

      1 Reply Last reply Reply Quote 0
      • C
        Code_ReaQtor last edited by

        This code at line 23 of GuiDialog.h seems like incomplete
        @GuiDialog(QWidget *, GameModel *);@

        try to change it this way:
        @GuiDialog(QWidget *parent, GameModel *model);@

        Please visit my open-source projects at https://github.com/Code-ReaQtor.

        1 Reply Last reply Reply Quote 0
        • M
          MuldeR last edited by

          Code_ReaQtor, I think it is okay to leave out the argument names in the declaration.

          AngelMacias, the error message would indicate that Ui::GuiDialog has no appropriate default constructor. But it seems you nowhere include the header file where that class is declared! Sure, in your GuiDialog.h you have a forward declaration of Ui::GuiDialog, but an actual declaration is missing! Which explains why that class cannot be instantiated! Normally you would have a Qt Designer .ui file that you compile with the "UIC":http://doc.qt.digia.com/qt/uic.html in order to generate the header .h file with the declaration of Ui::GuiDialog. This you would then include in your GuiDialog.cpp file, in addition to your own hand-written .h file! Note that GuiDialog and Ui::GuiDialog are two separate classes. The former is your own class, the latter is the class generated by Qt Designer/UIC.

          Have a look here:
          http://doc.qt.digia.com/qt/designer-using-a-ui-file.html

          BTW: What you are using is "The Single Inheritance Approach" with "Using a Pointer Member Variable".

          My OpenSource software at: http://muldersoft.com/

          Qt v4.8.6 MSVC 2013, static/shared: http://goo.gl/BXqhrS

          Go visit the coop: http://youtu.be/Jay...

          1 Reply Last reply Reply Quote 0
          • A
            AngelMacias last edited by

            I found what you were referring to MuldeR.

            @/********************************************************************************
            ** Form generated from reading UI file 'GuiDialog.ui'
            **
            ** Created: Fri Dec 7 16:13:14 2012
            ** by: Qt User Interface Compiler version 4.8.1
            **
            ** WARNING! All changes made in this file will be lost when recompiling UI file!
            ********************************************************************************/

            #ifndef UI_GUIDIALOG_H
            #define UI_GUIDIALOG_H

            #include <QtCore/QVariant>
            #include <QtGui/QAction>
            #include <QtGui/QApplication>
            #include <QtGui/QButtonGroup>
            #include <QtGui/QDialog>
            #include <QtGui/QHeaderView>
            #include <QtGui/QLCDNumber>
            #include <QtGui/QLabel>
            #include <QtGui/QPushButton>
            #include <QtGui/QSlider>
            #include <QtGui/QSpinBox>

            QT_BEGIN_NAMESPACE

            class Ui_Dialog
            {
            public:
            QSlider *slider;
            QSpinBox *spinBox;
            QPushButton *betButton;
            QLCDNumber *number;
            QLabel *playerCards;

            void setupUi(QDialog *Dialog)
            {
                if (Dialog->objectName().isEmpty())
                    Dialog->setObjectName(QString::fromUtf8("Dialog"));
                Dialog->resize(779, 462);
                Dialog->setStyleSheet(QString::fromUtf8("GuiDialog { background-image: url(:/images/table.png) };"));
                slider = new QSlider(Dialog);
                slider->setObjectName(QString::fromUtf8("slider"));
                slider->setGeometry(QRect(200, 400, 491, 21));
                slider->setOrientation(Qt::Horizontal);
                spinBox = new QSpinBox(Dialog);
                spinBox->setObjectName(QString::fromUtf8("spinBox"));
                spinBox->setGeometry(QRect(120, 400, 61, 22));
                betButton = new QPushButton(Dialog);
                betButton->setObjectName(QString::fromUtf8("betButton"));
                betButton->setGeometry(QRect(330, 360, 91, 31));
                number = new QLCDNumber(Dialog);
                number->setObjectName(QString::fromUtf8("number"));
                number->setGeometry(QRect(100, 350, 91, 41));
                number->setFrameShadow(QFrame::Sunken);
                number->setDigitCount(5);
                number->setProperty("intValue", QVariant(500));
                playerCards = new QLabel(Dialog);
                playerCards->setObjectName(QString::fromUtf8("playerCards"));
                playerCards->setGeometry(QRect(220, 190, 351, 131));
                playerCards->setPixmap(QPixmap(QString::fromUtf8(":/cards/Cards/back.jpg")));
            
                retranslateUi(Dialog);
                QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
                QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
            
                QMetaObject::connectSlotsByName(Dialog);
            } // setupUi
            
            void retranslateUi(QDialog *Dialog)
            {
                Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
                betButton->setText(QApplication::translate("Dialog", "Bet", 0, QApplication::UnicodeUTF8));
                playerCards->setText(QString());
            } // retranslateUi
            

            };

            namespace Ui {
            class Dialog: public Ui_Dialog {};
            } // namespace Ui

            QT_END_NAMESPACE

            #endif // UI_GUIDIALOG_H@

            So I tried doing this...

            @namespace Ui {
            class Dialog: public Ui_Dialog {};

            class GuiDialog : public Ui_Dialog { };
            

            }@

            The compiler did not give me any errors regarding the constructor anymore, but I just want to make sure I'm doing it right.

            1 Reply Last reply Reply Quote 0
            • M
              MuldeR last edited by

              I cannot follow your code... ???

              Normally your header file (.h), the one you write yourself, looks like:
              @#ifndef GUIDIALOG_H
              #define GUIDIALOG_H

              /* more includes you may need */

              //Forward declaration of Ui::GuiDialog
              namespace Ui
              {
              class GuiDialog;
              }

              //Your own class that uses the Ui::GuiDialog class
              class GuiDialog: public QDialog
              {
              Q_OBJECT

              public:
              GuiDialog(QWidget *, GameModel *);
              ~GuiDialog();

              /* ..... */
              

              private:
              Ui::GuiDialog *ui; //Pointer member-variable for GUI

              /* ..... */
              

              };

              #endif // GUIDIALOG_H@

              And in your code file (.cpp) you would do:
              @#include "GuiDialog.h" //Your own header file from above
              #include "UIC_GuiDialog.h" //The header generated by the UIC (for Ui::GuiDialog)

              /* more includes you may need */

              //Constructor
              GuiDialog::GuiDialog(QWidget *parent, GameModel *model) :
              QDialog(parent), ui(new Ui::GuiDialog)
              {
              ui->setupUi(this);
              }

              //Destructor
              GuiDialog::~GuiDialog(void)
              {
              delete ui;
              }

              /* ........... */
              @

              And remember: Never try to edit the .h file that UIC has generated. Your changes would be lost at the next re-compile. UIC re-generates the .h file from the .ui file. Just use the UIC-generated .h file as it pops out of UIC.

              Also: In the above code I assumed the UIC-generated file is at "UIC_GuiDialog.h". Adjust that path as required!

              My OpenSource software at: http://muldersoft.com/

              Qt v4.8.6 MSVC 2013, static/shared: http://goo.gl/BXqhrS

              Go visit the coop: http://youtu.be/Jay...

              1 Reply Last reply Reply Quote 0
              • P
                PROuC last edited by

                Hello MuldeR,

                due to the topic i get the same error C2512 by using Ui::SettingsDialog in combination with QSerialPort terminal example.

                I am using Qt 4.8.4 and could compile the master blocking example, so i guess that i install QSerialPort right. Do you have an idea or hint whats wrong?
                @
                #ifndef SETTINGSDIALOG_H
                #define SETTINGSDIALOG_H
                #include <QDialog>
                #include <QSettings>
                #include <QtSerialPort/QSerialPort>
                QT_USE_NAMESPACE
                namespace Ui {
                class SettingsDialog;
                }
                class QIntValidator;
                class SettingsDialog : public QDialog
                {
                Q_OBJECT

                public:
                struct Settings {
                QString name;
                qint32 baudRate;
                QString stringBaudRate;
                QSerialPort::DataBits dataBits;
                QString stringDataBits;
                QSerialPort::Parity parity;
                QString stringParity;
                QSerialPort::StopBits stopBits;
                QString stringStopBits;
                QSerialPort::FlowControl flowControl;
                QString stringFlowControl;
                bool localEchoEnabled;
                };

                SettingsDialog(QWidget *parent = 0);  //explicit
                ~SettingsDialog();
                
                Settings settings() const;
                

                private slots:
                void showPortInfo(int idx);
                void apply();
                void checkCustomBaudRatePolicy(int idx);

                private:
                void fillPortsParameters();
                void fillPortsInfo();
                void updateSettings();

                private:
                Ui::SettingsDialog *ui;
                Settings currentSettings;
                QIntValidator *intValidator;
                };

                #endif // SETTINGSDIALOG_H
                @

                @#include "settingsdialog.h"
                #include "ui_settingsdialog.h"

                #include <QtSerialPort/QSerialPortInfo>
                #include <QIntValidator>
                #include <QLineEdit>

                QT_USE_NAMESPACE

                SettingsDialog::SettingsDialog(QWidget *parent) :
                QDialog(parent),
                ui(new Ui::SettingsDialog) // here C2512
                {
                ui->setupUi(this);

                intValidator = new QIntValidator(0, 4000000, this);
                
                ui->baudRateBox->setInsertPolicy(QComboBox::NoInsert);
                
                connect(ui->applyButton, SIGNAL(clicked()),
                        this, SLOT(apply()));
                connect(ui->serialPortInfoListBox, SIGNAL(currentIndexChanged(int)),
                        this, SLOT(showPortInfo(int)));
                connect(ui->baudRateBox, SIGNAL(currentIndexChanged(int)),
                        this, SLOT(checkCustomBaudRatePolicy(int)));
                
                fillPortsParameters();
                fillPortsInfo();
                
                updateSettings();
                

                }

                SettingsDialog::~SettingsDialog()
                {
                delete ui;
                }

                SettingsDialog::Settings SettingsDialog::settings() const
                {
                return currentSettings;
                }
                // continued
                //
                }@

                Thank you for your help.

                1 Reply Last reply Reply Quote 0
                • M
                  MuldeR last edited by

                  Check your "ui_settingsdialog.h" file, which I assume was generated by UIC.

                  Is the file in place? And does it really define a class Ui::SettingsDialog? If so, how does the constructor of that class look?

                  My OpenSource software at: http://muldersoft.com/

                  Qt v4.8.6 MSVC 2013, static/shared: http://goo.gl/BXqhrS

                  Go visit the coop: http://youtu.be/Jay...

                  1 Reply Last reply Reply Quote 0
                  • P
                    PROuC last edited by

                    Hello MuldeR,

                    u assumed right, it was not generatet the ui_settingsdialog.h. I changed the constructor name to Dialog and did not changed the class name into the dialog.ui. It works great now.

                    @
                    <?xml version="1.0" encoding="UTF-8"?>
                    <ui version="4.0">
                    <class>Dialog</class> // here
                    <widget class="QDialog" name="Dialog">
                    <property name="geometry">
                    @

                    Thank you for your reply. It is going more and more clear for me.

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post