Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
qtws26_logo

The Qt Event of the Year: Qt World Summit 2026

Save Your Spot >
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved] Full MDI Example
Qt 6.12 LTS is out! See what's new in the release blog

[Solved] Full MDI Example

Scheduled Pinned Locked Moved General and Desktop
15 Posts 5 Posters 19.2k Views 1 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.
  • D Offline
    D Offline
    DenisKormalev
    wrote on last edited by
    #2

    Please don't use non-English language in non-national part of DevNet.

    1 Reply Last reply
    0
    • G Offline
      G Offline
      giesbert
      wrote on last edited by
      #3

      hi matheusssilva_BR,

      you just create a combined widget that you use a QMdiSubwindow, like you do with dialogs.

      Nokia Certified Qt Specialist.
      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

      1 Reply Last reply
      0
      • E Offline
        E Offline
        Exotic_Devel
        wrote on last edited by
        #4

        for example

        @#ifndef SUBWINDCLIENTES_H
        #define SUBWINDCLIENTES_H

        #include <QMdiSubWindow>

        class SubWindClientes : public QMdiSubWindow
        {
        public:
        SubWindClientes(QWidget *parent = 0, Qt::WindowFlags flags = 0);
        };

        #endif // SUBWINDCLIENTES_H
        @

        @#include "SubWindClientes.h"

        SubWindClientes::SubWindClientes(QWidget *parent, Qt::WindowFlags flags)
        {

        }@

        @#ifndef WINDOWMAIN_H
        #define WINDOWMAIN_H

        #include <QMainWindow>
        #include <QMdiArea>

        class WindowMain : public QMainWindow
        {

        public:
            WindowMain(QWidget *parent = 0);
        
            ~WindowMain();
        
        private:
            // Area MDI
            QMdiArea *mdiarea;
        
            // Menus
            QMenu *arquivos;
        
            // QActions de menus
            QAction *clientes;
        

        };

        #endif // WINDOWMAIN_H
        @

        @#include <QApplication>
        #include <QTextCodec>
        #include <QDesktopWidget>
        #include <QRect>
        #include <QMenuBar>
        #include <QToolBar> // Cabeçalhos da API Qt que serão usadas na janela pincipal
        #include <QStatusBar>
        #include <QList>
        #include <QLabel>

        #include "WindowMain.h" // Usa o arquivo de cabeçalho onde a classe foi definida

        /* Define a classe WindowMain e já invoca o
        construtor da classe pai, passando o ponteiro
        "parent" como parâmetro.*/

        WindowMain::WindowMain(QWidget *parent):QMainWindow(parent)
        {
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); // Define os caracteres da
        // aplicação p/ UTF-8

        setWindowTitle("Sistema Integrado de Gestão Óptica - MÓDULO RETAGUARDA");
        
        
        // Exibe a barra de status de QMainWindow
        statusBar()->show();
        
        // Prepara a area de trabalho MDI da aplicação
        mdiarea = new QMdiArea;
        setCentralWidget(mdiarea);
        
        
        // Prepara o menu principal da aplicação
        arquivos                        = menuBar()->addMenu("&Arquivo");
        
        
        // Prepara os itens de menu
        clientes                        = new QAction("Clientes", arquivos);
        
        // Carregando a lista de itens
        QList <QAction *> listarquivos;
        
        listarquivos << clientes;
        
        
        //Adicionando a lista de intens aos menus
        arquivos->addActions(listarquivos);
        
        // Deixando a janela no centro da tela
        QRect ct = geometry();
        ct.moveCenter(QApplication::desktop()->availableGeometry().center());
        setGeometry(ct);
        

        }

        WindowMain::~WindowMain()
        {
        delete mdiarea;
        }
        @

        How to open this QMdiSubWindow in this QMdiArea?

        1 Reply Last reply
        0
        • G Offline
          G Offline
          giesbert
          wrote on last edited by
          #5

          You can use the same logic as in the above mentioned example:

          @
          MdiChild *MainWindow::createMdiChild()
          {
          SubWindClientes *child = new SubWindClientes ;
          mdiArea->addSubWindow(child);
          return child;
          }
          @

          Nokia Certified Qt Specialist.
          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

          1 Reply Last reply
          0
          • E Offline
            E Offline
            Exotic_Devel
            wrote on last edited by
            #6

            When I run the application I get this output:

            Object:: connect: No such slot QMainWindow:: createMdiChild ()

            Below is the code:

            @#ifndef WINDOWMAIN_H
            #define WINDOWMAIN_H

            #include <QMainWindow>
            #include <QMdiArea>

            class WindowMain : public QMainWindow
            {

            public:
                WindowMain(QWidget *parent = 0);
            
                ~WindowMain();
            
            private slots:
                void createMdiChild();
            
            private:
                // Area MDI
                QMdiArea *mdiarea;
            
                // Menus
                QMenu *arquivos;
            
                // QActions de menus
                QAction *clientes;
            

            };

            #endif // WINDOWMAIN_H
            @

            @#include <QApplication>
            #include <QTextCodec>
            #include <QDesktopWidget>
            #include <QRect>
            #include <QMenuBar>
            #include <QToolBar> // Cabeçalhos da API Qt que serão usadas na janela pincipal
            #include <QStatusBar>
            #include <QList>
            #include <QLabel>

            #include "WindowMain.h" // Usa o arquivo de cabeçalho onde a classe foi definida
            #include "SubWindClientes.h"

            /* Define a classe WindowMain e já invoca o
            construtor da classe pai, passando o ponteiro
            "parent" como parâmetro.*/

            WindowMain::WindowMain(QWidget *parent):QMainWindow(parent)
            {
            QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); // Define os caracteres da
            // aplicação p/ UTF-8

            setWindowTitle("Sistema Integrado de Gestão Óptica - MÓDULO RETAGUARDA");
            
            
            // Exibe a barra de status de QMainWindow
            statusBar()->show();
            
            // Prepara a area de trabalho MDI da aplicação
            mdiarea = new QMdiArea;
            setCentralWidget(mdiarea);
            
            
            // Prepara o menu principal da aplicação
            arquivos                        = menuBar()->addMenu("&Arquivo");
            
            
            // Prepara os itens de menu
            clientes                        = new QAction("Clientes", arquivos);
            
            // Carregando a lista de itens
            QList <QAction *> listarquivos;
            
            listarquivos << clientes;
            
            
            //Adicionando a lista de intens aos menus
            arquivos->addActions(listarquivos);
            
            // Deixando a janela no centro da tela
            QRect ct = geometry();
            ct.moveCenter(QApplication::desktop()->availableGeometry().center());
            setGeometry(ct);
            
            connect(clientes, SIGNAL(triggered()), this, SLOT(createMdiChild()));
            

            }

            WindowMain::~WindowMain()
            {
            delete mdiarea;
            }

            void WindowMain::createMdiChild()
            {
            SubWindClientes *child = new SubWindClientes;
            mdiarea->addSubWindow(child);
            child->show();
            }
            @

            @#include "WindowMain.h"
            #include <QApplication>

            int main(int argc, char *argv [])
            {
            QApplication programa(argc, argv); // Objeto da aplicação

            WindowMain windmain;                 // Objeto da janela principal
            
            windmain.show();
            
            return programa.exec&#40;&#41;;
            

            }
            @

            Thanks for the help

            1 Reply Last reply
            0
            • G Offline
              G Offline
              giesbert
              wrote on last edited by
              #7

              your MainWindow misses the Q_OBJECT macro

              @
              #ifndef WINDOWMAIN_H
              #define WINDOWMAIN_H

              #include <QMainWindow>
              #include <QMdiArea>

              class WindowMain : public QMainWindow
              {
              Q_OBJECT;
              public:
              WindowMain(QWidget *parent = 0);

                  ~WindowMain();
                  // ...
              

              };

              #endif // WINDOWMAIN_H

              @

              Nokia Certified Qt Specialist.
              Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

              1 Reply Last reply
              0
              • E Offline
                E Offline
                Exotic_Devel
                wrote on last edited by
                #8

                Thanks friend, now running.
                After I added the Q_OBJECT started giving an error

                / home / Matthew / Projects / Tests / WindowMain.cpp: -1: error: undefined reference to `vtable for WindowMain '

                To solve edited the project file:

                of

                @HEADERS +=
                SubWindClientes.h
                WindowMain.h

                SOURCES +=
                SubWindClientes.cpp
                WindowMain.cpp
                Main.cpp
                @

                to

                @HEADERS +=
                SubWindClientes.h
                WindowMain.h \

                SOURCES +=
                SubWindClientes.cpp
                WindowMain.cpp
                Main.cpp
                @

                Do not know why just adding these two backslashes solved the error.

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  anselmolsm
                  wrote on last edited by
                  #9

                  [quote author="Denis Kormalev" date="1308946704"]Please don't use non-English language in non-national part of DevNet.[/quote]

                  matheusssilva_BR, I repeat, you can write in Portuguese in the "Portuguese forum":http://developer.qt.nokia.com/forums/viewforum/34 .
                  [pt_BR] Você pode escrever em Português no "fórum em Português":http://developer.qt.nokia.com/forums/viewforum/34 [/pt_BR]

                  [quote author="matheusssilva_BR" date="1309010152"]
                  Do not know why just adding these two backslashes solved the error.[/quote]

                  No, the backslashes did not solve your problem.

                  So, what happened?
                  When you edited the .pro file, you forced an automatic execution of qmake before the next execution of make. (Actually, if your .pro file looks like what you posted above, with a backslash after the last file name, I expected an error...)

                  Summing up: When you use the Q_OBJECT macro, the class has to be processed by moc (the Qt meta object compiler); in general qmake does it for you. This vtable error occurs when you add the Q_OBJECT macro and try to build the project without running qmake. For more details, "take a look here":http://doc.qt.nokia.com/4.7/metaobjects.html#meta-object-system

                  Anselmo L. S. Melo (anselmolsm)

                  1 Reply Last reply
                  0
                  • E Offline
                    E Offline
                    Exotic_Devel
                    wrote on last edited by
                    #10

                    So what would be the solution? I just edit the code to compile and send any extra procedure should be done by Qt Creator.

                    What to do now?


                    As for the forum in Portuguese'll be honest with you, when I visited the forum in Portuguese completely lost the will to participate, there are hardly any topics and there are few who do not have the majority response.
                    Truth be told Qt is widely used in Brazil and Portuguese-speaking countries.
                    I believe that we can not wait a large participation of Brazilians there.

                    Cursed be Cabral :-) |o|

                    I do not use Qt as the enthusiast, student, etc.. Although it is now beginning to develop in Qt I use for professional development, then the help of the community is very important to me.

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      anselmolsm
                      wrote on last edited by
                      #11

                      [quote author="matheusssilva_BR" date="1309015190"]So what would be the solution?
                      [/quote]

                      Run qmake when you add the Q_OBJECT macro.

                      [quote author="matheusssilva_BR" date="1309015190"]
                      I just edit the code to compile and send any extra procedure should be done by Qt Creator.
                      What to do now?
                      [/quote]

                      Qt Creator automatically ran qmake for you when you edited the .pro file. I don't know if Creator can internally detect when the user adds a new Q_OBJECT macro to a file. I also think it would be good.

                      In my previous post I explained to you that the backslash was not the solution.


                      I agree with you, unfortunately the Portuguese forums aren't popular. I recommended it for you because:

                      • you are a potential contributor to post things there;
                      • "you mentioned the use of google translator":http://developer.qt.nokia.com/forums/viewthread/6978/ to write your posts. So, that's why I thought you would feel more comfortable writing in Portuguese there. Of course you are free to keep posting in the international forums, it was just a suggestion.

                      Now it's better to stop this part of the discussion, as it is completely out of the scope of this thread.

                      Anselmo L. S. Melo (anselmolsm)

                      1 Reply Last reply
                      0
                      • E Offline
                        E Offline
                        Exotic_Devel
                        wrote on last edited by
                        #12

                        So what you say is that this is not the most appropriate way to resolve are problems? So what would it be? Run qmake manually?

                        The way I solved (by changing the .pro) can bring me any side effects?

                        What I axei strange is that after I edited the .pro in this project, other projects that also emit the error adding Q_OBJECT, now emit no more, without me having to edit .pro them.

                        1 Reply Last reply
                        0
                        • G Offline
                          G Offline
                          giesbert
                          wrote on last edited by
                          #13

                          I'm not 100% sure, when creator runs qmake, it definitly does when you edit the .pro file. Sometimes (I'm not sure if always) changing the logic that is needed for makefiles (which are created by qmake) needs rebuild by hand.

                          By hand means not to go to the command line, it means right click on the project --> rebuild.

                          Nokia Certified Qt Specialist.
                          Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                          1 Reply Last reply
                          0
                          • ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #14

                            Usually it's enough to just do "right click -> run qmake". If that doesn't work and I can't find the error I usually do a rebuilt (doesn't hurt once in while, especially, if you have generated files), too.

                            1 Reply Last reply
                            0
                            • E Offline
                              E Offline
                              Exotic_Devel
                              wrote on last edited by
                              #15

                              Ok, understood now, we won, was a big help

                              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
                              • Unsolved