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. Splitview weird behavior
QtWS25 Last Chance

Splitview weird behavior

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
13 Posts 3 Posters 1.0k 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.
  • I Imynn

    @JoeCFD Sure. As you can see on the screen, after shrinking the window, red has minimum width, and it is out of window bounds. Once I touch handle, it will shrink the blue rectangle, so the minimum of the red will be within window bounds. SplitView bug.png

    JoeCFDJ Offline
    JoeCFDJ Offline
    JoeCFD
    wrote on last edited by
    #4

    @Imynn Check the numbers. I tried the following and the layout seems ok. The width of Red area is squeezed below 200.

        SplitView {
            anchors.fill: parent
            Rectangle {
                SplitView.maximumWidth: 434
                SplitView.minimumWidth: 434
                color: "blue"
            }
    
    JoeCFDJ 1 Reply Last reply
    0
    • JoeCFDJ JoeCFD

      @Imynn Check the numbers. I tried the following and the layout seems ok. The width of Red area is squeezed below 200.

          SplitView {
              anchors.fill: parent
              Rectangle {
                  SplitView.maximumWidth: 434
                  SplitView.minimumWidth: 434
                  color: "blue"
              }
      
      JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by
      #5

      @JoeCFD With your code, I can not move the blue area to width 434. the splitter stops at where red area has width 200.

      import QtQuick.Window 2.15
      import QtQuick.Controls 2.15
      Window {
         width: 474
         height: 480
         visible: true
         title: qsTr("Hello World")
         SplitView {
             anchors.fill: parent
             Rectangle {
                 SplitView.preferredWidth: 200
                 SplitView.minimumWidth: 200
                 color: "blue"
             }
             Rectangle {
                 color: "red"
                 SplitView.minimumWidth: 200
             }
         }
      }
      
      I 1 Reply Last reply
      0
      • JoeCFDJ JoeCFD

        @JoeCFD With your code, I can not move the blue area to width 434. the splitter stops at where red area has width 200.

        import QtQuick.Window 2.15
        import QtQuick.Controls 2.15
        Window {
           width: 474
           height: 480
           visible: true
           title: qsTr("Hello World")
           SplitView {
               anchors.fill: parent
               Rectangle {
                   SplitView.preferredWidth: 200
                   SplitView.minimumWidth: 200
                   color: "blue"
               }
               Rectangle {
                   color: "red"
                   SplitView.minimumWidth: 200
               }
           }
        }
        
        I Offline
        I Offline
        Imynn
        wrote on last edited by
        #6

        @JoeCFD Yes, once it stops, shrink the window. And handle won't move and splitview children won't resize. So window size gets smaller, and splitview children don't change their width, which causes blue rectangle to be out of window bounds

        1 Reply Last reply
        0
        • I Imynn

          @JoeCFD Sure. As you can see on the screen, after shrinking the window, red has minimum width, and it is out of window bounds. Once I touch handle, it will shrink the blue rectangle, so the minimum of the red will be within window bounds. SplitView bug.png

          I Offline
          I Offline
          Imynn
          wrote on last edited by
          #7

          @Imynn this is after shrinking the window. Initially the window was 640x480

          JoeCFDJ 1 Reply Last reply
          0
          • I Imynn

            @Imynn this is after shrinking the window. Initially the window was 640x480

            JoeCFDJ Offline
            JoeCFDJ Offline
            JoeCFD
            wrote on last edited by
            #8

            @Imynn I tried it on Linux. After splitter stops, red area will disappear when I reduce the width of the window. No problem at all on Linux.

            I 1 Reply Last reply
            0
            • JoeCFDJ JoeCFD

              @Imynn I tried it on Linux. After splitter stops, red area will disappear when I reduce the width of the window. No problem at all on Linux.

              I Offline
              I Offline
              Imynn
              wrote on last edited by
              #9

              @JoeCFD Yes, red area disappears, because it's out of window bounds. It still has width 200 which is minimumWidth. The behavior that I expect is that it doesn't disappear, but instead moves to the left and blue rectangle shrinks. Is it achievable?

              JoeCFDJ 1 Reply Last reply
              0
              • I Imynn

                @JoeCFD Yes, red area disappears, because it's out of window bounds. It still has width 200 which is minimumWidth. The behavior that I expect is that it doesn't disappear, but instead moves to the left and blue rectangle shrinks. Is it achievable?

                JoeCFDJ Offline
                JoeCFDJ Offline
                JoeCFD
                wrote on last edited by JoeCFD
                #10

                @Imynn remove
                SplitView.minimumWidth: 200
                from the first Rectangle(blue one).

                I 1 Reply Last reply
                0
                • JoeCFDJ JoeCFD

                  @Imynn remove
                  SplitView.minimumWidth: 200
                  from the first Rectangle(blue one).

                  I Offline
                  I Offline
                  Imynn
                  wrote on last edited by Imynn
                  #11

                  @JoeCFD It didn't help either.

                  import QtQuick 2.15
                  import QtQuick.Window 2.15
                  import QtQuick.Controls 2.15
                  Window {
                      id: root
                      width: 640
                      height: 480
                      visible: true
                      title: qsTr("Hello World")
                      SplitView {
                          anchors.fill: parent
                          Rectangle {
                              id: rectBlue
                              SplitView.preferredWidth: 400
                              color: "blue"
                              Column {
                                  anchors.centerIn: parent
                                  Text {
                                      color: "white"
                                      text: "Red width %1".arg(rect.width)
                                  }
                                  Text {
                                      color: "white"
                                      text: "Window width %1".arg(root.width)
                                  }
                                  Text {
                                      color: "white"
                                      text: "Blue width %1".arg(rectBlue.width)
                                  }
                              }
                          }
                  
                          Rectangle {
                              id: rect
                              color: "red"
                              SplitView.minimumWidth: 200
                          }
                      }
                  }
                  
                  

                  With above code when I resize window (make it smaller) both Rectangles go out of the window bounds
                  5cb52c4d-8d33-42b9-9a3f-0a5e764bdc23-image.png
                  eba6f2f7-d717-4595-aa28-c87c46c1c181-image.png
                  These images are taken when inspecting the scene with gammaray. On the first screen you can see actual size of the blue rectangle, which is out of window bounds. On the second screen you can see size and position of the red rectangle which is out of window bounds as well. And text informations provides actual width of all components. What I expect after resizing the window according to the code I provided above: 200(minimumWidth) red width, 90 blue width, 6 handle, which in sum wiil give window width 296.

                  JoeCFDJ 1 Reply Last reply
                  0
                  • I Imynn

                    @JoeCFD It didn't help either.

                    import QtQuick 2.15
                    import QtQuick.Window 2.15
                    import QtQuick.Controls 2.15
                    Window {
                        id: root
                        width: 640
                        height: 480
                        visible: true
                        title: qsTr("Hello World")
                        SplitView {
                            anchors.fill: parent
                            Rectangle {
                                id: rectBlue
                                SplitView.preferredWidth: 400
                                color: "blue"
                                Column {
                                    anchors.centerIn: parent
                                    Text {
                                        color: "white"
                                        text: "Red width %1".arg(rect.width)
                                    }
                                    Text {
                                        color: "white"
                                        text: "Window width %1".arg(root.width)
                                    }
                                    Text {
                                        color: "white"
                                        text: "Blue width %1".arg(rectBlue.width)
                                    }
                                }
                            }
                    
                            Rectangle {
                                id: rect
                                color: "red"
                                SplitView.minimumWidth: 200
                            }
                        }
                    }
                    
                    

                    With above code when I resize window (make it smaller) both Rectangles go out of the window bounds
                    5cb52c4d-8d33-42b9-9a3f-0a5e764bdc23-image.png
                    eba6f2f7-d717-4595-aa28-c87c46c1c181-image.png
                    These images are taken when inspecting the scene with gammaray. On the first screen you can see actual size of the blue rectangle, which is out of window bounds. On the second screen you can see size and position of the red rectangle which is out of window bounds as well. And text informations provides actual width of all components. What I expect after resizing the window according to the code I provided above: 200(minimumWidth) red width, 90 blue width, 6 handle, which in sum wiil give window width 296.

                    JoeCFDJ Offline
                    JoeCFDJ Offline
                    JoeCFD
                    wrote on last edited by
                    #12

                    @Imynn said in Splitview weird behavior:

                    SplitView

                    https://doc.qt.io/qt-5/qml-qtquick-controls2-splitview.html

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      burnack
                      wrote on last edited by
                      #13

                      Hi @Imynn , I just faced the same problem and was able to solve it the following way.
                      The problem is that from the documentation there is always 1 element in a SplitView that fills the width (height for vertical). And by default it is the last one. By regulating that element depending on the window width you can choose which one changes width along with the window. So I set red.fillWidth to false and blue.fillWidth to true when the window width is less than the threshold.
                      I even did smth like

                      splitview.onResizingChanged: if (!resizing) userBlueWidth = blue.width; // saving the blue width on the splitter drag release
                      fillerRectIndex: Window.width < userBlueWidth + splitter.width + red.minWidth ? blueIndex : redIndex
                      Red {
                      SplitView.fillWidth: fillRectIndex == redIndex
                      }
                      Blue {
                      SplitView.fillWidth: fillRectIndex == blueIndex
                      }

                      Then the blue becomes the filler and starts shrinking.
                      Good luck!

                      1 Reply Last reply
                      1

                      • Login

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