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. How to stretch the child nodes of QTreeView
Forum Updated to NodeBB v4.3 + New Features

How to stretch the child nodes of QTreeView

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 3 Posters 2.0k 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.
  • M mpergand

    Is the treeview inside a layout ?

    D Offline
    D Offline
    deleted385
    wrote on last edited by deleted385
    #3

    @mpergand, It's inside a QSplitter and that splitter is inside a QVBoxLayout. The QWidget that contains the QTreeView is inside a QStackedWidget and that StackedWidget is the centralWidget of the QMainWindow.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mpergand
      wrote on last edited by
      #4

      I think you have to add a layout to the widget containing the treeview for this one to expand.

      To visualize the actual size of the treeview, you can do:
      tree->setFrameShape(QFrame::Box);

      To verify if your interface is correct, you can try to reproduce it in the Designer and see if it works as you expected.

      D 1 Reply Last reply
      0
      • M mpergand

        I think you have to add a layout to the widget containing the treeview for this one to expand.

        To visualize the actual size of the treeview, you can do:
        tree->setFrameShape(QFrame::Box);

        To verify if your interface is correct, you can try to reproduce it in the Designer and see if it works as you expected.

        D Offline
        D Offline
        deleted385
        wrote on last edited by deleted385
        #5

        @mpergand, I've put these 3 segments in a QWidget named QueryWidget. On the left where the TreeView is, called ObjectView and on the right the CodeEditor and in bottom a textbox, and for now everything is in its constructor:

        QueryWidget::QueryWidget(QWidget *parent) : QWidget(parent)
        {
            objects = new ObjectsView(this);
            codeEditor = new CodeEditor(this);
            auto textBox = new QTextEdit(this);
            auto split1 = new QSplitter(Qt::Horizontal, this);
            auto split2 = new QSplitter(Qt::Vertical, this);
        
            split1->addWidget(objects);
            split1->addWidget(codeEditor);
            QSizePolicy obj(QSizePolicy::Preferred, QSizePolicy::Preferred);
            QSizePolicy cod(QSizePolicy::Preferred, QSizePolicy::Preferred);
            obj.setHorizontalStretch(1);
            cod.setHorizontalStretch(3);
            objects->setSizePolicy(obj);
            codeEditor->setSizePolicy(cod);
        
            split2->addWidget(split1);
            split2->addWidget(textBox);
            QSizePolicy sp1(QSizePolicy::Preferred, QSizePolicy::Preferred);
            QSizePolicy txt(QSizePolicy::Preferred, QSizePolicy::Preferred);
            sp1.setVerticalStretch(2);
            txt.setVerticalStretch(1);
            split1->setSizePolicy(sp1);
            textBox->setSizePolicy(txt);
        
            auto vLay = new QVBoxLayout(this);
            vLay->addWidget(split2);
        }
        

        in the ObjectView's constructor I've a toolBar and treeview in QVBoxlayout:

        ObjectsView::ObjectsView(QWidget *parent) : QWidget(parent)
        {
            auto toolBar = new QToolBar(this);
            tree = new QTreeView(this);
            tree->setHeaderHidden(true);
        
            auto attach = new QAction(QIcon(":/database-plus.svg"), "attach database", this);
            toolBar->addAction(attach);
            connect(attach, &QAction::triggered, this, &ObjectsView::openFileDialog);
        
            auto layout = new QVBoxLayout(this);
            layout->setContentsMargins(0,0,0,0);
            layout->addWidget(toolBar);
            layout->addWidget(tree);
            setLayout(layout);
        }
        

        and in the MainWindow's constructor I've put the QueryWidget in the StackWidget like this:

        Window::Window(QWidget *parent) : QMainWindow(parent)
        {
            stack = new QStackedWidget(this);
            queryWidget = new QueryWidget(stack);
            tableWidget = new TableWidget(stack);
            stack->addWidget(queryWidget);
            stack->addWidget(tableWidget);
            setCentralWidget(stack);
            ....
        }
        

        I've tried the tree->setFrameShape(QFrame::Box) BUT there's no apparent difference in the Window.

        1 Reply Last reply
        0
        • M Offline
          M Offline
          mpergand
          wrote on last edited by mpergand
          #6

          I've tried the tree->setFrameShape(QFrame::Box) BUT there's no apparent difference in the Window.

          It doesn't change anything, it draws a box around the treeview.

          Look at this splitter
          splitter

          The frame on the left doesn't expand because the parent widget has no layout.

          [EDIT]

          auto layout = new QVBoxLayout(this);
              layout->setContentsMargins(0,0,0,0);
              layout->addWidget(toolBar);
              layout->addWidget(tree);
              setLayout(layout);
          

          Your code seems correct.
          If you don't add the toolbar, what happens ?
          Do you see the frame box around the tree ?

          D 1 Reply Last reply
          1
          • M mpergand

            I've tried the tree->setFrameShape(QFrame::Box) BUT there's no apparent difference in the Window.

            It doesn't change anything, it draws a box around the treeview.

            Look at this splitter
            splitter

            The frame on the left doesn't expand because the parent widget has no layout.

            [EDIT]

            auto layout = new QVBoxLayout(this);
                layout->setContentsMargins(0,0,0,0);
                layout->addWidget(toolBar);
                layout->addWidget(tree);
                setLayout(layout);
            

            Your code seems correct.
            If you don't add the toolbar, what happens ?
            Do you see the frame box around the tree ?

            D Offline
            D Offline
            deleted385
            wrote on last edited by
            #7

            @mpergand, it shows the border around the treeview without setFrameShape. See, it takes up the remainder of the QVboxLayout and shows black/grey border around white space allocated for the QTreeView:
            x1.gif

            1 Reply Last reply
            0
            • M Offline
              M Offline
              mpergand
              wrote on last edited by mpergand
              #8

              You may set a minimum width for the first column or save/restore the state of the header,
              see QHeaderView :

              QByteArray QHeaderView::saveState() const
              Saves the current state of this header view.
              To restore the saved state, pass the return value to restoreState().
              This function was introduced in Qt 4.3.
              See also restoreState().

              D 1 Reply Last reply
              2
              • M mpergand

                You may set a minimum width for the first column or save/restore the state of the header,
                see QHeaderView :

                QByteArray QHeaderView::saveState() const
                Saves the current state of this header view.
                To restore the saved state, pass the return value to restoreState().
                This function was introduced in Qt 4.3.
                See also restoreState().

                D Offline
                D Offline
                deleted385
                wrote on last edited by
                #9

                @mpergand, I don't want to show the headers with splitter on top and without that I can't change the state manually. like I did in the GIF example above.

                kshegunovK 1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mpergand
                  wrote on last edited by
                  #10

                  Look at the doc about QHeaderView::ResizeMode
                  and this methods:
                  setMinimumSectionSize(int size)
                  setDefaultSectionSize(int size)
                  and others ...

                  1 Reply Last reply
                  1
                  • D deleted385

                    @mpergand, I don't want to show the headers with splitter on top and without that I can't change the state manually. like I did in the GIF example above.

                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by
                    #11

                    @Emon-Haque said in How to stretch the child nodes of QTreeView:

                    @mpergand, I don't want to show the headers with splitter on top and without that I can't change the state manually. like I did in the GIF example above.

                    Did you mean this?

                    tree->header()->setSectionResizeMode(0, QHeaderView::Stretch);
                    

                    Read and abide by the Qt Code of Conduct

                    D 1 Reply Last reply
                    1
                    • kshegunovK kshegunov

                      @Emon-Haque said in How to stretch the child nodes of QTreeView:

                      @mpergand, I don't want to show the headers with splitter on top and without that I can't change the state manually. like I did in the GIF example above.

                      Did you mean this?

                      tree->header()->setSectionResizeMode(0, QHeaderView::Stretch);
                      
                      D Offline
                      D Offline
                      deleted385
                      wrote on last edited by
                      #12

                      @kshegunov, exactly. Now with header hidden, columns stretches automatically as I move the splitter.
                      Thanks

                      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