Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. No Appropriate Default Constructor -- Help Please??
QtWS25 Last Chance

No Appropriate Default Constructor -- Help Please??

Scheduled Pinned Locked Moved General and Desktop
8 Posts 4 Posters 12.8k Views
  • 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 Offline
    A Offline
    AngelMacias
    wrote on last edited by
    #1

    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
    0
    • C Offline
      C Offline
      Code_ReaQtor
      wrote on last edited by
      #2

      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
      0
      • M Offline
        M Offline
        MuldeR
        wrote on last edited by
        #3

        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
        0
        • A Offline
          A Offline
          AngelMacias
          wrote on last edited by
          #4

          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
          0
          • M Offline
            M Offline
            MuldeR
            wrote on last edited by
            #5

            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
            0
            • P Offline
              P Offline
              PROuC
              wrote on last edited by
              #6

              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
              0
              • M Offline
                M Offline
                MuldeR
                wrote on last edited by
                #7

                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
                0
                • P Offline
                  P Offline
                  PROuC
                  wrote on last edited by
                  #8

                  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
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved