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. Creating two main.qml files, shared codebase
Forum Updated to NodeBB v4.3 + New Features

Creating two main.qml files, shared codebase

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
14 Posts 2 Posters 816 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.
  • SGaistS SGaist

    If you named the folder literally "+selector" then no, that part is wrong. "selector" must be replaced with an adequate value as explained in the link you posted.

    You need to explain what exactly you want to accomplish because at this time it's unclear what you want to use the File Selector concept for.

    Q Offline
    Q Offline
    qcoderpro
    wrote on last edited by
    #5

    "selector" must be replaced with an adequate value

    What does that mean? :(

    as explained in the link you posted.

    I read the section a couple of time but can't understand it completely sadly! :(

    You need to explain what exactly you want to accomplish

    I've nothing in my mind for that except learning what the link in that section tries to teach. It's the first time I encounter such a feature. I merely want to learn that for future uses.
    The link says:
    The two main.qml files are placed in the file system as shown below. This lets the file selector that the QML engine automatically creates pick the right file. By default, the Fusion main.qml is loaded. If the android selector is present, then the Material main.qml is loaded instead.

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

      If you name your folder "+android", the the main.qml file from that folder will be loaded when running your application on that platform.

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

      Q 1 Reply Last reply
      0
      • SGaistS SGaist

        If you name your folder "+android", the the main.qml file from that folder will be loaded when running your application on that platform.

        Q Offline
        Q Offline
        qcoderpro
        wrote on last edited by
        #7

        Here's my main.cpp:
        e1.PNG

        And other files: +android -> main.qml:

        import QtQuick
        import QtQuick.Controls
        
        ImageViewerWindow {
            id: window
        
            width: 640
            height: 480
        
            menuBar: MenuBar {
                Menu {
                    title: qsTr("&File")
                    MenuItem {
                        text: qsTr("&Open...")
                        icon.name: "document-open"
                        onTriggered: window.openFileDialog()
                    }
                }
        
                Menu {
                    title: qsTr("&Help")
                    MenuItem {
                        text: qsTr("&About...")
                        onTriggered: window.openAboutDialog()
                    }
                }
            }
        
            header: ToolBar {
                Flow {
                    anchors.fill: parent
                    ToolButton {
                        text: qsTr("Open")
                        icon.name: "document-open"
                        onClicked: window.openFileDialog()
                    }
                }
            }
        }
        

        ImageViewerWindow.qml:

        import QtQuick
        import QtQuick.Controls
        import Qt.labs.platform as Labs
        
        ApplicationWindow {
            visible: true
            title: qsTr("Image Viewer")
            function openFiledialog() { fileDialog.open() }
            function openAboutDialog() { aboutDialog.open() }
        
            background: Rectangle {
                color: "darkGray"
            }
        
            Image {
                id: image
                anchors.fill: parent
                fillMode: Image.PreserveAspectFit
                asynchronous: true
            }
        
            Labs.FileDialog {
                id: fileOpenDialog
                title: "Select an image file"
                folder: Labs.StandardPaths.writableLocation(Labs.StandardPaths.DocumentsLocation)
                nameFilters: [ "Image files (*.png *.jpeg *.jpg)" ]
                onAccepted: image.source = fileOpenDialog.currentFile
            }
        
            Dialog {
                id: aboutDialog
                title: qsTr("About")
                Label {
                    anchors.fill: parent
                    text: qsTr("QML Image Viewer\nA part of the QmlBook\nhttp://qmlbook.org")
                    horizontalAlignment: Text.AlignHCenter
                }
                standardButtons: Dialog.Ok
            }
        }
        

        main.qml:

        import QtQuick
        import QtQuick.Controls
        import QtQuick.Controls.Material
        
        ImageViewerWindow {
            id: window
        
            width: 360
            height: 520
        
              Drawer {
                id: drawer
                width: Math.min(window.width, window.height) / 3 * 2
                height: window.height
        
                ListView {
                    focus: true
                    currentIndex: -1
                    anchors.fill: parent
        
                    delegate: ItemDelegate {
                        width: parent.width
                        text: model.text
                        highlighted: ListView.isCurrentItem
                        onClicked: {
                            drawer.close()
                            model.triggered()
                        }
                    }
                    model: ListModel {
                        ListElement {
                            text: qsTr("Open ...")
                            triggered: function () { fileOpenDialog.open() }
                        }
                        ListElement {
                            text: qsTr("About ...")
                            triggered: function() {aboutDialog.open() }
                        }
                    }
                    ScrollIndicator.vertical: ScrollIndicator {}
                }
            }
        
            header: ToolBar {
                Flow {
                    anchors.fill: parent
                    ToolButton {
                        text: qsTr("Open")
                        icon.name: "document-open"
                        onClicked: window.openFileDialog()
                    }
                }
            }
        }
        

        When I run the project and click on the Open button, I get this error:
        TypeError: Property 'openFileDialog' of object ImageViewerWindow_QMLTYPE_13(0x222d1303030) is not a function

        (related to line 50 of main.qml, onClicked: window.openFileDialog())

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #8
          function openFiledialog() { fileDialog.open() }
          

          Shouldn't it be "fileOpenDialog.open()" ?

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

          Q 1 Reply Last reply
          0
          • SGaistS SGaist
            function openFiledialog() { fileDialog.open() }
            

            Shouldn't it be "fileOpenDialog.open()" ?

            Q Offline
            Q Offline
            qcoderpro
            wrote on last edited by
            #9

            @SGaist said

            Shouldn't it be "fileOpenDialog.open()" ?

            I don't think so, because we have a function the following way defined in the ImageViewerWindow.qml file:

            function openFiledialog() { fileDialog.open() }

            We're calling that function indeed!

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

              The issue is that you have an id that is the same as the function name with just two words reversed. Hence my question.

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

              Q 1 Reply Last reply
              1
              • SGaistS SGaist

                The issue is that you have an id that is the same as the function name with just two words reversed. Hence my question.

                Q Offline
                Q Offline
                qcoderpro
                wrote on last edited by qcoderpro
                #11

                @SGaist

                Yeah, right. I fixed it, thanks.

                One question: in main main.qml file we have:

                import QtQuick
                import QtQuick.Controls
                import QtQuick.Controls.Material
                
                ImageViewerWindow {
                // ...
                 model: ListModel {
                                ListElement {
                                    text: qsTr("Open ...")
                                    triggered: function() { openFiledialog() }
                                }
                                ListElement {
                                    text: qsTr("About ...")
                                    triggered: function() { openAboutDialog() }
                                }
                            }
                //...
                }
                

                Why can't we use triggered like this: triggered: openFiledialog() ? That's calling the function directly instead of declaring a function just for that purpose?

                My second question is: how to run the project with different styles, please?
                I mean, how to run the project for the Fusion style and how to for the Material style?
                I think the use case of this feature (shared codebase) is also this.

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

                  Because it's a model and thus there's no GUI interaction there.

                  As for switching the selector, it's again described in the article you linked in your post. Use the QT_FILE_SELECTORS environment variable.

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

                  Q 1 Reply Last reply
                  0
                  • SGaistS SGaist

                    Because it's a model and thus there's no GUI interaction there.

                    As for switching the selector, it's again described in the article you linked in your post. Use the QT_FILE_SELECTORS environment variable.

                    Q Offline
                    Q Offline
                    qcoderpro
                    wrote on last edited by
                    #13

                    @SGaist

                    Because it's a model and thus there's no GUI interaction there.

                    I didn't get that answer. Could you explain it a little more, please?

                    it's again described in the article you linked in your post. Use the QT_FILE_SELECTORS environment variable.

                    It says: During development you can set the environment variable QT_FILE_SELECTORS to android to simulate this. But where is that QT_FILE_SELECTORS to set it to android!?

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

                      It's an environment variable. You have to set it.

                      You can do it in Qt Creator in the Run part of the Project panel.

                      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

                      • Login

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