Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Adding TabButton dynamically to TabBar
Forum Update on Monday, May 27th 2025

Adding TabButton dynamically to TabBar

Scheduled Pinned Locked Moved Solved QML and Qt Quick
qtquick2qtquickcontrolsqtquickcontroltabbutton
14 Posts 4 Posters 9.5k 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.
  • P pra7
    27 Jul 2017, 14:05

    @LeLev .. Thanks for the answer and Is there any way to get the each TabButton item which is created in Repeater ? .
    I need to call some function on the fly in "TabBar" curentIndexChanged event handler ..

    O Offline
    O Offline
    ODБOï
    wrote on 27 Jul 2017, 14:38 last edited by
    #4

    @pra7

    I cant understant what exactly are you trying to do.

    in "TabBar" curentIndexChanged event handler i guess you will do some action depending which button is clicked right ?

    You can do that by simply adding an 'onClicked' handler on your TabButton like this :

    TabButton{
    width: 100
    text: "Btn n° " + index
    onClicked { console.log(index) } // for exemple
    }

    LA

    1 Reply Last reply
    0
    • O Offline
      O Offline
      ODБOï
      wrote on 27 Jul 2017, 14:42 last edited by
      #5

      This can help you to access repeater Itemes:
      https://stackoverflow.com/questions/13270818/how-to-access-the-properties-of-a-repeaters-children-in-qml

      and this, if you want to try an other approche (Dynamic Qml Object creation )
      http://doc.qt.io/qt-5/qtqml-javascript-dynamicobjectcreation.html

      LA

      1 Reply Last reply
      1
      • O Offline
        O Offline
        ODБOï
        wrote on 27 Jul 2017, 14:46 last edited by
        #6

        https://forum.qt.io/topic/36501/solved-add-remove-tabs-dynamically/3

        P 1 Reply Last reply 27 Jul 2017, 14:54
        0
        • O ODБOï
          27 Jul 2017, 13:13

          Hello,

          this is one way to do that using Repeater type.

          import QtQuick 2.0
          import QtQuick.Window 2.2
          import QtQuick.Controls 2.0
          import QtQuick.Layouts 1.3

          Window {
          visible: true
          width: 640
          height: 480

              Button
              {
                  id:button
                  width:100
                  height:100
                  anchors.top:parent.top
                  text:"add"//qStr("Add")
                  onClicked:{
          
                          tabBtnRepeater.model ++
          
                  }
              }
          
              TabBar
              {
                  id:tabBar
                  anchors.top:button.bottom
                  width:500
                  height:500
          
                  Repeater{
                      id: tabBtnRepeater
          
                      model : 0 //
          
                      TabButton{
                          width: 100
                          text: "Btn n° " + index
                      }
          
                  }
          
          
              }
          }
          

          LA

          P Offline
          P Offline
          pra7
          wrote on 27 Jul 2017, 14:52 last edited by pra7
          #7

          @LeLev In my question, you can see that TabButton is created in a separate file. So, based on index changed event I need to do some stuff inside doSomething() on all the TabButtons present in the TabBar.

          I got the solution by using the Component as below :

          in MainForm.Qml

          Component {
                 id: myTabButton
                 MyTabButton {
                     Connections {
                         target: tabBar
                         onCurrentIndexChanged: doSomething()
                     }
                }
             }
          
          Button
             {
                 id:button
                 width:100
                 height:100
                 anchors.top:parent.top
                 text:qStr("Add")
                 onClicked{
                 // A object out of the component, and adding it to the container
                 onClicked: tabBar.addItem(myTabButton.createObject(tabBar /*, { object to set properties }*/))
             }
          

          Thus Whenever an index is changed doSomething function will be called.

          1 Reply Last reply
          1
          • O ODБOï
            27 Jul 2017, 14:46

            https://forum.qt.io/topic/36501/solved-add-remove-tabs-dynamically/3

            P Offline
            P Offline
            pra7
            wrote on 27 Jul 2017, 14:54 last edited by
            #8

            @LeLev Thanks for all your suggestions....

            1 Reply Last reply
            1
            • O Offline
              O Offline
              ODБOï
              wrote on 27 Jul 2017, 14:57 last edited by
              #9

              You are welcome :)

              1 Reply Last reply
              0
              • O Offline
                O Offline
                ODБOï
                wrote on 27 Jul 2017, 15:07 last edited by
                #10

                Full version with normal 'TabButton' :

                import QtQuick 2.0
                import QtQuick.Window 2.2
                import QtQuick.Controls 2.0
                import QtQuick.Layouts 1.3

                Window {
                visible: true
                width: 640
                height: 480

                function doSomething(){
                    console.log(tabBar.currentIndex)
                }
                
                Component {
                       id: myTabButton
                       TabButton {
                           Connections {
                               target: tabBar
                               onCurrentIndexChanged: doSomething()
                           }
                      }
                   }
                
                
                    Button
                    {
                        id:button
                        width:100
                        height:100
                        anchors.top:parent.top
                        text:"add"
                        onClicked:{
                                tabBar.addItem(myTabButton.createObject(tabBar ))
                            
                        }
                    }
                
                    TabBar
                    {
                        id:tabBar
                        anchors.top:button.bottom
                        width:500
                        height:500
                
                    }
                }
                

                I'm still intrigued by one thing ! why doSomething() is called 2 times ??
                LA

                1 Reply Last reply
                0
                • O Offline
                  O Offline
                  ODБOï
                  wrote on 27 Jul 2017, 15:11 last edited by
                  #11

                  It is not called 2 times but 'addedButtonNumber' times

                  if we have 2 btns it is called 2 times
                  if we have 3, 3 times and so on

                  LA

                  P 1 Reply Last reply 27 Jul 2017, 15:25
                  1
                  • O ODБOï
                    27 Jul 2017, 15:11

                    It is not called 2 times but 'addedButtonNumber' times

                    if we have 2 btns it is called 2 times
                    if we have 3, 3 times and so on

                    LA

                    P Offline
                    P Offline
                    pra7
                    wrote on 27 Jul 2017, 15:25 last edited by
                    #12

                    @LeLev Yes .. it will be called based on TabBar.Count ...

                    E 1 Reply Last reply 28 Jul 2017, 08:29
                    0
                    • P pra7
                      27 Jul 2017, 15:25

                      @LeLev Yes .. it will be called based on TabBar.Count ...

                      E Offline
                      E Offline
                      Eeli K
                      wrote on 28 Jul 2017, 08:29 last edited by
                      #13

                      @pra7 createObject may be the best solution for you. As an exercise I tried another way:

                      import QtQuick 2.6
                      import QtQuick.Layouts 1.3
                      import QtQuick.Controls 2.1
                      
                      ApplicationWindow {
                          id: window
                          width: 360
                          height: 520
                          visible: true
                      
                      
                          ColumnLayout
                          {
                              Button
                              {
                                  id:button
                                  text:"add"
                                  onClicked: {
                                      control.contentItem.model.append({"text":"x"})
                                  }
                              }
                              TabBar
                              {
                                  {
                                  Layout.fillWidth: true
                                  id: control
                      
                                  contentItem: ListView {
                                      implicitWidth: contentWidth
                                      implicitHeight: 40
                      
                                      model: ListModel{}
                                      delegate: TabButton{text:model.modelData}
                                      currentIndex: control.currentIndex
                      
                                      spacing: control.spacing
                                      orientation: ListView.Horizontal
                                      boundsBehavior: Flickable.StopAtBounds
                                      flickableDirection: Flickable.AutoFlickIfNeeded
                                      snapMode: ListView.SnapToItem
                      
                                      highlightMoveDuration: 0
                                      highlightRangeMode: ListView.ApplyRange
                                      preferredHighlightBegin: 40
                                      preferredHighlightEnd: width - 40
                                  }
                              }
                          }
                      }
                      

                      The TabBar code is taken partly from Default style's TabBar.qml to make it look and behave indentically.

                      1 Reply Last reply
                      1
                      • G Offline
                        G Offline
                        GrecKo
                        Qt Champions 2018
                        wrote on 28 Jul 2017, 08:49 last edited by GrecKo
                        #14

                        Simpler alternative, just a Repeater with a ListModel inside TabBar :

                        import QtQuick 2.0
                        import QtQuick.Window 2.2
                        import QtQuick.Controls 2.0
                        
                        ApplicationWindow {
                            visible: true
                            width: 640
                            height: 480
                        
                            ListModel {
                                id: tabModel
                            }
                        
                            TabBar
                            {
                                Repeater {
                                    model: tabModel
                                    TabButton {
                                        text: model.text + " " + model.index
                                        onClicked: tabModel.remove(model.index)
                                    }
                                }
                            }
                        
                            Button
                            {
                                anchors.centerIn: parent
                                text:"add"
                                onClicked: tabModel.append({text: "tab"});
                            }
                        }
                        

                        EDIT: My bad, I didn't saw @LeLev first answer, it's very similar to mine. But I fell compelled to post it cause there's a lot of over complicated code in the following answers.

                        1 Reply Last reply
                        0

                        13/14

                        28 Jul 2017, 08:29

                        • Login

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