Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [SOLVED] QTabWidget->widget(index) returns null pointer
Qt 6.12 LTS is out! See what's new in the release blog

[SOLVED] QTabWidget->widget(index) returns null pointer

Scheduled Pinned Locked Moved General and Desktop
15 Posts 3 Posters 10.2k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #5

    That's the correct way, but are you sure that the widget at index is a QTabWidget ?

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    ? 1 Reply Last reply
    0
    • Chris KawaC Offline
      Chris KawaC Offline
      Chris Kawa
      Lifetime Qt Champion
      wrote on last edited by
      #6

      QTabWidget is the widget that manages tabs. You don't add QTabWidgets to it. You add content to that tab widget and what you get back is the index of newly created tab, not a pointer to anything:

      QWidget* someContent = ... 
      QWidget* someMoreContent = ... 
      
      int someContentIndex = ui->tabWidget->addTab(someContent, "Some content");
      int someMoreContentIndex = ui->tabWidget->addTab(someMoreContent, "Some more content");
      

      The above adds content from code. If you added tabs in the designer then you can access their content via widget() method. But don't cast them to QTabWidget because they are not (unless you really added a tab widget to tab widget's tab). They are whatever you added For example if you added a QPushButton then you should cast to that. If you added a QLineEdit then cast to that.

      1 Reply Last reply
      0
      • SGaistS SGaist

        That's the correct way, but are you sure that the widget at index is a QTabWidget ?

        ? Offline
        ? Offline
        A Former User
        wrote on last edited by SGaist
        #7

        @SGaist @Chris-Kawa Yes .. But, the main QTabWidget is supposed to contain only the QTabWidgets added using that function:

        MainWindow::add_new_tab ( QString tabtext )
        {
                QWidget * tw;
                tw = new QWidget;
                this->ui->tabWidget->addTab(tw, tabtext);
                QFormLayout * fl = new QFormLayout;
                this->ui->tabWidget->widget((this->ui->tabWidget->count()) ? 0 : this->ui->tabWidget->count()-2)->setLayout(fl);
             }}
        

        [edit: Corrected coding tags, SGaist]

        1 Reply Last reply
        0
        • Chris KawaC Offline
          Chris KawaC Offline
          Chris Kawa
          Lifetime Qt Champion
          wrote on last edited by Chris Kawa
          #8

          Note that this code (very contrived) adds QWidgets to QTabWidget, not QTabWidgets to QTabWidget. It can be simplified like this:

          void MainWindow::add_new_tab (const QString& tabtext ) //don't copy strings, pass them by const reference
          {
              QWidget * tw = new QWidget;
              tw->setLayout(new QFormLayout);
              ui->tabWidget->addTab(tw, tabtext);
          }
          

          Then, when you want to get a pointer to that widget, you can do it like this:

          int index = ... 
          QWidget* w = ui->tabWidget->widget(index);
          if(w) {
              //do something with the widget, for example add something to its layout:
              w->layout()->addWidget(new QPushButton("Hello"));
          }
          

          Btw. Please use ``` tags for code longer than one line. It's hard to read it if you inline it like that.

          ? 1 Reply Last reply
          0
          • Chris KawaC Chris Kawa

            Note that this code (very contrived) adds QWidgets to QTabWidget, not QTabWidgets to QTabWidget. It can be simplified like this:

            void MainWindow::add_new_tab (const QString& tabtext ) //don't copy strings, pass them by const reference
            {
                QWidget * tw = new QWidget;
                tw->setLayout(new QFormLayout);
                ui->tabWidget->addTab(tw, tabtext);
            }
            

            Then, when you want to get a pointer to that widget, you can do it like this:

            int index = ... 
            QWidget* w = ui->tabWidget->widget(index);
            if(w) {
                //do something with the widget, for example add something to its layout:
                w->layout()->addWidget(new QPushButton("Hello"));
            }
            

            Btw. Please use ``` tags for code longer than one line. It's hard to read it if you inline it like that.

            ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #9

            @Chris-Kawa @SGaist I tried that code, to check what is the got widget:

                        QWidget * w;
                        QTabWidget * t;
                        w = this->ui->tabWidget->widget(0);
                        t = qobject_cast <QTabWidget*>(w);
                        if (t)
                            this->add_new_tab(t, QString::fromUtf8("New Tab"));
                        else
                            QMessageBox::critical(0 , 0, w->objectName());
            

            but always I got blank string in the empty critical message, while tabWidget contains more than a QTabWidget. That's a serious bug in my program.

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #10

              Did you try with the excellent examples @Chris-Kawa shared ?

              From your input either this->ui->tabWidget->widget(0); returns 0 or if not 0 it returns a QWidget that is not a QTabWidget.

              From your code:

              QWidget * tw;
              tw = new QWidget;
              this->ui->tabWidget->addTab(tw, tab text);
              

              This code adds a new QWidget inside a new tab of your QTabWidget. It does not create a new QTabWidget. QTabWidget is a "container" widget.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              ? 1 Reply Last reply
              0
              • SGaistS SGaist

                Did you try with the excellent examples @Chris-Kawa shared ?

                From your input either this->ui->tabWidget->widget(0); returns 0 or if not 0 it returns a QWidget that is not a QTabWidget.

                From your code:

                QWidget * tw;
                tw = new QWidget;
                this->ui->tabWidget->addTab(tw, tab text);
                

                This code adds a new QWidget inside a new tab of your QTabWidget. It does not create a new QTabWidget. QTabWidget is a "container" widget.

                ? Offline
                ? Offline
                A Former User
                wrote on last edited by A Former User
                #11

                @SGaist I tried the code of @Chris-Kawa: the pushbutton was added successfully to the child QTabWidget.

                Ah, right I understand all now after looking to a tabwidget I created already, for testing, within the designer: my mistake was missing the correct widget type of such contained tabs. Now I understand that is QWidget and not QTabWidget. Anyway, is it possible to add new tabs to the child tabs (because I need that in my app) ?

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #12

                  Then start by creating that "sub QTabWidget" with all what is needed and then add it to the ui->tab widget

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  ? 1 Reply Last reply
                  0
                  • SGaistS SGaist

                    Then start by creating that "sub QTabWidget" with all what is needed and then add it to the ui->tab widget

                    ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by
                    #13

                    @SGaist I mean how to pass the QWidget as a QTabWidget as a parent for adding new chilld tab for it.

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #14

                      You can't automagically transform a QWidget in a QTabWidget. If you want a QTabWidget in a tab of a QTabWidget, then you have to do something like:

                      QTabWidget *childTabWidget = new QTabWidget;
                      // setup of childTabWidget
                      ui-> tabwidget->addTab(childTabWidget);
                      

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      ? 1 Reply Last reply
                      0
                      • SGaistS SGaist

                        You can't automagically transform a QWidget in a QTabWidget. If you want a QTabWidget in a tab of a QTabWidget, then you have to do something like:

                        QTabWidget *childTabWidget = new QTabWidget;
                        // setup of childTabWidget
                        ui-> tabwidget->addTab(childTabWidget);
                        
                        ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by
                        #15

                        @SGaist That's it, exactly. That solved the whole problem! I can see the child tabs on my app now. My mistake was following a misleading example. Thanks a lot.

                        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