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. Is it possible to create an Item (qml) with its own Window?
Forum Updated to NodeBB v4.3 + New Features

Is it possible to create an Item (qml) with its own Window?

Scheduled Pinned Locked Moved Solved QML and Qt Quick
11 Posts 5 Posters 1.7k Views 2 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 mnesarco

    Hi Friends,
    I want to create a QuickItem to embed some external content, but i need a Window. As far as I know, all the qml scene share the same window. In my case I need my own window but i need it to play well with layouts. I need someting like QtQuick.Window but embedded as a normal Item in the scene.

    Do you think it is possible?

    Thanks,
    Frank.

    B Offline
    B Offline
    Bob64
    wrote on last edited by
    #2

    @mnesarco I might have misunderstood, but isn't Window what you need? You can use this to create a new top-level window, parented to your 'main' window.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mnesarco
      wrote on last edited by
      #3

      The problem with Window is that it is no managed by the Layouts inside the parent window. It is an independent window.

      J.HilkJ 1 Reply Last reply
      0
      • M mnesarco

        The problem with Window is that it is no managed by the Layouts inside the parent window. It is an independent window.

        J.HilkJ Offline
        J.HilkJ Offline
        J.Hilk
        Moderators
        wrote on last edited by
        #4

        @mnesarco So what exactly do you want ?

        The look of a separated window, but fixed inside the layout of an other qml component ?


        Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


        Q: What's that?
        A: It's blue light.
        Q: What does it do?
        A: It turns blue.

        1 Reply Last reply
        0
        • M Offline
          M Offline
          mnesarco
          wrote on last edited by
          #5

          What I want is an Item that have its own native Window, but looks and behave like any other Item (ie like a Rectangle) so it can be layed out like any other component. Noboby needs to know that it is actually another window.

          I managed to do that creating an Item with a nested frameless window and connecting Item's x,y,width,height with the window. It works but I wonder if is there a better way.

          1 Reply Last reply
          0
          • fcarneyF Offline
            fcarneyF Offline
            fcarney
            wrote on last edited by
            #6

            @mnesarco said in Is it possible to create an Item (qml) with its own Window?:

            Item that have its own native Window

            What is the driver behind this?

            C++ is a perfectly valid school of magic.

            1 Reply Last reply
            0
            • M Offline
              M Offline
              mnesarco
              wrote on last edited by
              #7

              I am using opengl backend.
              This is my current solution:

              // WindowItem.qml
              
              import QtQuick
              import QtQuick.Window
              import QtQuick.Controls
              
              Item {
                  id: root
                  default property alias data: wnd.data
                  property int globalX: { 
                      var p = parent;
                      var v = Window.window.x + x;        
                      while (p) {
                          if (p.x) {
                              v += p.x;
                          }
                          if (p.contentItem != null) {
                              v += p.contentItem.x;
                          }
                          p = p.parent;
                      }
                      return v;
                  }
                  property int globalY: { 
                      var p = parent;
                      var v = Window.window.y + y;        
                      while (p) {
                          if (p.y) {
                              v += p.y;
                          }
                          if (p.contentItem != null) {
                              v += p.contentItem.y;
                          }
                          p = p.parent;
                      }
                      return v;
                  }
                  property int flags: Qt.WindowStaysOnBottomHint
                  
                  Window {
                      id: wnd
                      flags: Qt.Tool | Qt.FramelessWindowHint | root.flags
                      x: root.globalX
                      y: root.globalY
                      width: root.width
                      height: root.height
                      visible: true
                  }
              }
              
              

              It can be used inside the scene and play well with layouts:

              Row {
                Label {
                  ...
                }
                WindowItem {
                  ....
                }
              }
              
              B 1 Reply Last reply
              0
              • M mnesarco

                I am using opengl backend.
                This is my current solution:

                // WindowItem.qml
                
                import QtQuick
                import QtQuick.Window
                import QtQuick.Controls
                
                Item {
                    id: root
                    default property alias data: wnd.data
                    property int globalX: { 
                        var p = parent;
                        var v = Window.window.x + x;        
                        while (p) {
                            if (p.x) {
                                v += p.x;
                            }
                            if (p.contentItem != null) {
                                v += p.contentItem.x;
                            }
                            p = p.parent;
                        }
                        return v;
                    }
                    property int globalY: { 
                        var p = parent;
                        var v = Window.window.y + y;        
                        while (p) {
                            if (p.y) {
                                v += p.y;
                            }
                            if (p.contentItem != null) {
                                v += p.contentItem.y;
                            }
                            p = p.parent;
                        }
                        return v;
                    }
                    property int flags: Qt.WindowStaysOnBottomHint
                    
                    Window {
                        id: wnd
                        flags: Qt.Tool | Qt.FramelessWindowHint | root.flags
                        x: root.globalX
                        y: root.globalY
                        width: root.width
                        height: root.height
                        visible: true
                    }
                }
                
                

                It can be used inside the scene and play well with layouts:

                Row {
                  Label {
                    ...
                  }
                  WindowItem {
                    ....
                  }
                }
                
                B Offline
                B Offline
                Bob64
                wrote on last edited by
                #8

                @mnesarco it's kind of a secondary point but I wondered if you might be able to save some of that work you are doing with coordinate mapping by using the mapToItem function from Item?

                On the main topic, did you consider using a custom QQuickItem to integrate your external content? I don't know how feasible it would be but there are hooks to insert your own scene graph content.

                M 1 Reply Last reply
                0
                • B Bob64

                  @mnesarco it's kind of a secondary point but I wondered if you might be able to save some of that work you are doing with coordinate mapping by using the mapToItem function from Item?

                  On the main topic, did you consider using a custom QQuickItem to integrate your external content? I don't know how feasible it would be but there are hooks to insert your own scene graph content.

                  M Offline
                  M Offline
                  mnesarco
                  wrote on last edited by
                  #9

                  @Bob64 I have used mapToGlobal with bad results, so I resorted to manual parent position calculation. I have to try mapToItem, the main problem is that those functions do not take into account the size of the Menubar in the window. And because the Window is a top level window, at the end, I need to add Window's position too.

                  I have my own QQuickItem in C++, the problem is that the external renderer (OpenCascade/opengl) uses the whole window and I cannot change that. So I need to provide a different window because if not it renders under the whole schene.

                  1 Reply Last reply
                  0
                  • L Offline
                    L Offline
                    Lucasvct
                    wrote on last edited by
                    #10

                    Hi @mnesarco, I have the same problem. Did you find a solution ?

                    M 1 Reply Last reply
                    0
                    • L Lucasvct

                      Hi @mnesarco, I have the same problem. Did you find a solution ?

                      M Offline
                      M Offline
                      mnesarco
                      wrote on last edited by
                      #11

                      @Lucasvct I have posted my current solution in this thread. have you tryed it?

                      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