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. Newbie in QT: what is wrong with my first QT code?
Forum Updated to NodeBB v4.3 + New Features

Newbie in QT: what is wrong with my first QT code?

Scheduled Pinned Locked Moved Unsolved General and Desktop
4 Posts 4 Posters 352 Views 3 Watching
  • 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.
  • E Offline
    E Offline
    ElfMoon
    wrote on last edited by ElfMoon
    #1

    I am new in QT Cpp with Java Form background. My question is can we put all code from file Dialog.cpp and Dialog.h and main.cpp into one file? I want to create a code which is one copy-paste file and F5 to run.
    Here is the code, what is wrong with it?

    #include "mainwindow.h"
    #include <QAction>
    #include <QApplication>
    #include <QComboBox>
    #include <QDialog>
    #include <QDialogButtonBox>
    #include <QFormLayout>
    #include <QGroupBox>
    #include <QLabel>
    #include <QLineEdit>
    #include <QMainWindow>
    #include <QMenu>
    #include <QMenuBar>
    #include <QPushButton>
    #include <QSpinBox>
    #include <QTextEdit>
    #include <QVBoxLayout>
    #include <QWidget>
    
    /*
    QT_BEGIN_NAMESPACE
    class QAction;
    class QDialogButtonBox;
    class QGroupBox;
    class QLabel;
    class QLineEdit;
    class QMenu;
    class QMenuBar;
    class QPushButton;
    class QTextEdit;
    QT_END_NAMESPACE
    */
    
    //! [0]
    class Dialog : public QDialog {
           Q_OBJECT
    
         public:
           Dialog();
    
         private:
           void createMenu();
           void createHorizontalGroupBox();
           void createGridGroupBox();
           void createFormGroupBox();
    
           enum { NumGridRows = 3, NumButtons = 4 };
    
           QMenuBar *menuBar;
           QGroupBox *horizontalGroupBox;
           QGroupBox *gridGroupBox;
           QGroupBox *formGroupBox;
           QTextEdit *smallEditor;
           QTextEdit *bigEditor;
           QLabel *labels[NumGridRows];
           QLineEdit *lineEdits[NumGridRows];
           QPushButton *buttons[NumButtons];
           QDialogButtonBox *buttonBox;
    
           QMenu *fileMenu;
           QAction *exitAction;
    };
    //! [0]
    
    Dialog::Dialog() {
           createMenu();
           createHorizontalGroupBox();
           createGridGroupBox();
           createFormGroupBox();
    
           bigEditor = new QTextEdit;
           bigEditor->setPlainText(
               tr( "This widget takes up all the remaining space "
                   "in the top-level layout." ) );
    
           buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok |
                                             QDialogButtonBox::Cancel );
    
           connect( buttonBox, &QDialogButtonBox::accepted, this,
                    &QDialog::accept );
           connect( buttonBox, &QDialogButtonBox::rejected, this,
                    &QDialog::reject );
    
           QVBoxLayout *mainLayout = new QVBoxLayout;
           mainLayout->setMenuBar( menuBar );
           mainLayout->addWidget( horizontalGroupBox );
           mainLayout->addWidget( gridGroupBox );
           mainLayout->addWidget( formGroupBox );
           mainLayout->addWidget( bigEditor );
           mainLayout->addWidget( buttonBox );
           setLayout( mainLayout );
    
           setWindowTitle( tr( "Basic Layouts" ) );
    }
    
    //! [6]
    void Dialog::createMenu() {
           menuBar = new QMenuBar;
    
           fileMenu = new QMenu( tr( "&File" ), this );
           exitAction = fileMenu->addAction( tr( "E&xit" ) );
           menuBar->addMenu( fileMenu );
    
           connect( exitAction, &QAction::triggered, this, &QDialog::accept );
    }
    //! [6]
    
    //! [7]
    void Dialog::createHorizontalGroupBox() {
           horizontalGroupBox = new QGroupBox( tr( "Horizontal layout" ) );
           QHBoxLayout *layout = new QHBoxLayout;
    
           for ( int i = 0; i < NumButtons; ++i ) {
                  buttons[i] = new QPushButton( tr( "Button %1" ).arg( i + 1 ) );
                  layout->addWidget( buttons[i] );
           }
           horizontalGroupBox->setLayout( layout );
    }
    //! [7]
    
    //! [8]
    void Dialog::createGridGroupBox() {
           gridGroupBox = new QGroupBox( tr( "Grid layout" ) );
           //! [8]
           QGridLayout *layout = new QGridLayout;
    
           //! [9]
           for ( int i = 0; i < NumGridRows; ++i ) {
                  labels[i] = new QLabel( tr( "Line %1:" ).arg( i + 1 ) );
                  lineEdits[i] = new QLineEdit;
                  layout->addWidget( labels[i], i + 1, 0 );
                  layout->addWidget( lineEdits[i], i + 1, 1 );
           }
    
           //! [9] //! [10]
           smallEditor = new QTextEdit;
           smallEditor->setPlainText(
               tr( "This widget takes up about two thirds of the "
                   "grid layout." ) );
           layout->addWidget( smallEditor, 0, 2, 4, 1 );
           //! [10]
    
           //! [11]
           layout->setColumnStretch( 1, 10 );
           layout->setColumnStretch( 2, 20 );
           gridGroupBox->setLayout( layout );
    }
    //! [11]
    
    //! [12]
    void Dialog::createFormGroupBox() {
           formGroupBox = new QGroupBox( tr( "Form layout" ) );
           QFormLayout *layout = new QFormLayout;
           layout->addRow( new QLabel( tr( "Line 1:" ) ), new QLineEdit );
           layout->addRow( new QLabel( tr( "Line 2, long text:" ) ),
                           new QComboBox );
           layout->addRow( new QLabel( tr( "Line 3:" ) ), new QSpinBox );
           formGroupBox->setLayout( layout );
    }
    
    int main( int argc, char *argv[] ) {
           QApplication app( argc, argv );
           Dialog dialog;
    
    #ifdef Q_OS_ANDROID
           dialog.showMaximized();
    #else
           dialog.show();
    #endif
           return app.exec();
    }
    
    

    Here is the errors:
    error: undefined reference to vtable for Dialog' error: undefined reference to Dialog::staticMetaObject'
    :-1: error: collect2.exe: error: ld returned 1 exit status
    :-1: error: [Makefile.Debug:72: debug/QTProject001.exe] Error 1

    Here is the reference link:
    https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/layouts/basiclayouts

    JKSHJ 1 Reply Last reply
    0
    • E ElfMoon

      I am new in QT Cpp with Java Form background. My question is can we put all code from file Dialog.cpp and Dialog.h and main.cpp into one file? I want to create a code which is one copy-paste file and F5 to run.
      Here is the code, what is wrong with it?

      #include "mainwindow.h"
      #include <QAction>
      #include <QApplication>
      #include <QComboBox>
      #include <QDialog>
      #include <QDialogButtonBox>
      #include <QFormLayout>
      #include <QGroupBox>
      #include <QLabel>
      #include <QLineEdit>
      #include <QMainWindow>
      #include <QMenu>
      #include <QMenuBar>
      #include <QPushButton>
      #include <QSpinBox>
      #include <QTextEdit>
      #include <QVBoxLayout>
      #include <QWidget>
      
      /*
      QT_BEGIN_NAMESPACE
      class QAction;
      class QDialogButtonBox;
      class QGroupBox;
      class QLabel;
      class QLineEdit;
      class QMenu;
      class QMenuBar;
      class QPushButton;
      class QTextEdit;
      QT_END_NAMESPACE
      */
      
      //! [0]
      class Dialog : public QDialog {
             Q_OBJECT
      
           public:
             Dialog();
      
           private:
             void createMenu();
             void createHorizontalGroupBox();
             void createGridGroupBox();
             void createFormGroupBox();
      
             enum { NumGridRows = 3, NumButtons = 4 };
      
             QMenuBar *menuBar;
             QGroupBox *horizontalGroupBox;
             QGroupBox *gridGroupBox;
             QGroupBox *formGroupBox;
             QTextEdit *smallEditor;
             QTextEdit *bigEditor;
             QLabel *labels[NumGridRows];
             QLineEdit *lineEdits[NumGridRows];
             QPushButton *buttons[NumButtons];
             QDialogButtonBox *buttonBox;
      
             QMenu *fileMenu;
             QAction *exitAction;
      };
      //! [0]
      
      Dialog::Dialog() {
             createMenu();
             createHorizontalGroupBox();
             createGridGroupBox();
             createFormGroupBox();
      
             bigEditor = new QTextEdit;
             bigEditor->setPlainText(
                 tr( "This widget takes up all the remaining space "
                     "in the top-level layout." ) );
      
             buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok |
                                               QDialogButtonBox::Cancel );
      
             connect( buttonBox, &QDialogButtonBox::accepted, this,
                      &QDialog::accept );
             connect( buttonBox, &QDialogButtonBox::rejected, this,
                      &QDialog::reject );
      
             QVBoxLayout *mainLayout = new QVBoxLayout;
             mainLayout->setMenuBar( menuBar );
             mainLayout->addWidget( horizontalGroupBox );
             mainLayout->addWidget( gridGroupBox );
             mainLayout->addWidget( formGroupBox );
             mainLayout->addWidget( bigEditor );
             mainLayout->addWidget( buttonBox );
             setLayout( mainLayout );
      
             setWindowTitle( tr( "Basic Layouts" ) );
      }
      
      //! [6]
      void Dialog::createMenu() {
             menuBar = new QMenuBar;
      
             fileMenu = new QMenu( tr( "&File" ), this );
             exitAction = fileMenu->addAction( tr( "E&xit" ) );
             menuBar->addMenu( fileMenu );
      
             connect( exitAction, &QAction::triggered, this, &QDialog::accept );
      }
      //! [6]
      
      //! [7]
      void Dialog::createHorizontalGroupBox() {
             horizontalGroupBox = new QGroupBox( tr( "Horizontal layout" ) );
             QHBoxLayout *layout = new QHBoxLayout;
      
             for ( int i = 0; i < NumButtons; ++i ) {
                    buttons[i] = new QPushButton( tr( "Button %1" ).arg( i + 1 ) );
                    layout->addWidget( buttons[i] );
             }
             horizontalGroupBox->setLayout( layout );
      }
      //! [7]
      
      //! [8]
      void Dialog::createGridGroupBox() {
             gridGroupBox = new QGroupBox( tr( "Grid layout" ) );
             //! [8]
             QGridLayout *layout = new QGridLayout;
      
             //! [9]
             for ( int i = 0; i < NumGridRows; ++i ) {
                    labels[i] = new QLabel( tr( "Line %1:" ).arg( i + 1 ) );
                    lineEdits[i] = new QLineEdit;
                    layout->addWidget( labels[i], i + 1, 0 );
                    layout->addWidget( lineEdits[i], i + 1, 1 );
             }
      
             //! [9] //! [10]
             smallEditor = new QTextEdit;
             smallEditor->setPlainText(
                 tr( "This widget takes up about two thirds of the "
                     "grid layout." ) );
             layout->addWidget( smallEditor, 0, 2, 4, 1 );
             //! [10]
      
             //! [11]
             layout->setColumnStretch( 1, 10 );
             layout->setColumnStretch( 2, 20 );
             gridGroupBox->setLayout( layout );
      }
      //! [11]
      
      //! [12]
      void Dialog::createFormGroupBox() {
             formGroupBox = new QGroupBox( tr( "Form layout" ) );
             QFormLayout *layout = new QFormLayout;
             layout->addRow( new QLabel( tr( "Line 1:" ) ), new QLineEdit );
             layout->addRow( new QLabel( tr( "Line 2, long text:" ) ),
                             new QComboBox );
             layout->addRow( new QLabel( tr( "Line 3:" ) ), new QSpinBox );
             formGroupBox->setLayout( layout );
      }
      
      int main( int argc, char *argv[] ) {
             QApplication app( argc, argv );
             Dialog dialog;
      
      #ifdef Q_OS_ANDROID
             dialog.showMaximized();
      #else
             dialog.show();
      #endif
             return app.exec();
      }
      
      

      Here is the errors:
      error: undefined reference to vtable for Dialog' error: undefined reference to Dialog::staticMetaObject'
      :-1: error: collect2.exe: error: ld returned 1 exit status
      :-1: error: [Makefile.Debug:72: debug/QTProject001.exe] Error 1

      Here is the reference link:
      https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/layouts/basiclayouts

      JKSHJ Offline
      JKSHJ Offline
      JKSH
      Moderators
      wrote on last edited by JKSH
      #2

      Hi, and welcome!

      @ElfMoon said in Newbie in QT: what is wrong with my first QT code?:

      can we put all code from file Dialog.cpp and Dialog.h and main.cpp into one file?

      It is possible to do this. However, you must then write #include "moc_XXX.cpp" in your file (where XXX.cpp is the name of your file). See https://forum.qt.io/topic/85833/when-is-time-to-include-moc_xxx-cpp-at-bottom-of-a-cpp-file

      error: undefined reference to vtable for Dialog' error: undefined reference toDialog::staticMetaObject'

      Qt's Meta-Object Compiler (moc, https://doc.qt.io/qt-5/moc.html ) needs to process all classes that inherit QObject and contain the Q_OBJECT macro.

      This error occured because moc did not detect and process your Dialog class.

      moc can automatically detect classes that are defined in .h files. But if you define your class in a .cpp file, then you must write #include "moc_XXX.cpp" to tell moc to process the .cpp file.

      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

      A 1 Reply Last reply
      2
      • JKSHJ JKSH

        Hi, and welcome!

        @ElfMoon said in Newbie in QT: what is wrong with my first QT code?:

        can we put all code from file Dialog.cpp and Dialog.h and main.cpp into one file?

        It is possible to do this. However, you must then write #include "moc_XXX.cpp" in your file (where XXX.cpp is the name of your file). See https://forum.qt.io/topic/85833/when-is-time-to-include-moc_xxx-cpp-at-bottom-of-a-cpp-file

        error: undefined reference to vtable for Dialog' error: undefined reference toDialog::staticMetaObject'

        Qt's Meta-Object Compiler (moc, https://doc.qt.io/qt-5/moc.html ) needs to process all classes that inherit QObject and contain the Q_OBJECT macro.

        This error occured because moc did not detect and process your Dialog class.

        moc can automatically detect classes that are defined in .h files. But if you define your class in a .cpp file, then you must write #include "moc_XXX.cpp" to tell moc to process the .cpp file.

        A Offline
        A Offline
        Asperamanca
        wrote on last edited by
        #3

        @JKSH
        A matter of "it's possible", but I wouldn't recommend it.

        1 Reply Last reply
        0
        • fcarneyF Offline
          fcarneyF Offline
          fcarney
          wrote on last edited by
          #4

          When doing test projects that include classes in main.cpp I put this at the bottom:

          #include "main.moc"
          

          You will have to run qmake, try to build, then run qmake again for it to "see" it.

          C++ is a perfectly valid school of magic.

          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