QML, сбой при использовании компонентов другого файла qml - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема с использованием компонентов qml из другого файла qml.У меня есть 2 файла, main.qml и menu.qml (menu.qml находится в другой папке с именем menu).В menu.qml у меня есть меню, которое я хочу использовать в main.qml

import QtQuick 2.9
import QtQuick.Controls 2.4

Menu {
    id: routingMenu
    width: maximumWidth
    height: 200
    y: 20
    cascade: true
    Rectangle {
        Label {
            x: (app_window.width / 8)
            text: "FROM:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
        Label {
            y: routingMenu.height / 7
            text: "Country:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
        Label {
            y: routingMenu.height / 2.5
            text: "City:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
        Label {
            y: routingMenu.height / 1.6
            text: "Street:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
        Label {
            y: routingMenu.height / 1.2
            text: "Postal Code:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
    } //Rectangle

    Rectangle {
         x: app_window.width / 2
         Label {
             x: (app_window.width / 4)
             text: "TO:"
             font.pixelSize: 22
             font.italic: true
             color: "black"
         }
         Label {
             y: routingMenu.height / 7
             text: "Country:"
             font.pixelSize: 22
             font.italic: true
             color: "black"
         }
         Label {
             y: routingMenu.height / 2.5
             text: "City:"
             font.pixelSize: 22
             font.italic: true
             color: "black"
        }
        Label {
            y: routingMenu.height / 1.6
            text: "Street:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
        Label {
            y: routingMenu.height / 1.2
            text: "Postal Code:"
            font.pixelSize: 22
            font.italic: true
            color: "black"
        }
    } //Rectangle

    Button {
        id: sendDataToItem
        width: 100
        height: 40
        x: app_window.width / 2.7
        text: "Send"

        onClicked: {
            //fromAddress.country: "";
            //fromAddress.city: "";
            //fromAddress.street: "";
            //fromAddress.postalCode: "";

            //toAddress.country: "";
            //toAddress.city: "";
            //toAddress.street: "";
            //toAddress.postalCode: "";
        }
    } //sendDataToItem
} //Menu

Я пытался использовать компонент, но он мне не помог.Это код моего main.qml

import QtQuick 2.10
import QtQuick.Controls 2.2
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
import "menu"

ApplicationWindow {
    id: app_window
    visible: true
    width: maximumWidth
    height: maximumHeight
    title: qsTr("Navigation")


    PositionSource {
           active: true
           onPositionChanged: {
           //map_id.center = position.coordinate;
           }
    }

    Plugin {
        id: mapPlugin_
        name: "osm"
    }

    /*Loader {
            id: loadered
            focus: true
            source: "menu/menu.qml"
            active: true
        }*/


    Rectangle {
         id: mapRectangleID
         width: 800
         height: 800
         x:0
         y:20

         Map {
            id: map_
            anchors.fill: parent
            plugin: mapPlugin_
            center: QtPositioning.coordinate(51.320729390711975,12.280097007751465)
            zoomLevel: 15

            MapQuickItem {
                       id: marker_id
                       coordinate: QtPositioning.coordinate(59.91, 10.75)
                       sourceItem: Image {
                               id: endPointImage
                               source: "assets/marker.png"
                               width: 100
                               height: 100
                       } //size and position of maker
                       anchorPoint.x: endPointImage.width / 2
                       anchorPoint.y: endPointImage.height
            } //marker

            RouteModel {
                    id: routeBetweenPoints
                    plugin: Plugin { name: "osm" }
                    query: RouteQuery {id: routeQuery }
                    Component.onCompleted: {
                    routeQuery.addWaypoint(QtPositioning.coordinate(51.318784,12.2773504 ));
                    routeQuery.addWaypoint(QtPositioning.coordinate(51.3117764,12.280909000000065 ));
                       //routeQuery.addWaypoint(endPointGeaocodeModel)
                    update();
                    }
            } //start and end point

            MapItemView {
                model: routeBetweenPoints
                delegate: Component {
                    MapRoute {
                        route: routeData
                        line.color: "red"
                        line.width: 10
                    }
                } //Component
            }//linie, die beide punkte verbindet

            GeocodeModel{
                 id: endPointGeaocodeModel
                 plugin: Plugin { name: "osm" }
                 query: "Sandakerveien 116, Oslo"
                 onLocationsChanged: {
                     if (count> 0){
                        marker_id.coordinate = get(0).coordinate
                        map_id.center = get(0).coordinate
                     }
                 }
                     Component.onCompleted: update()
            } //suche den platz mit strasse und stadt








            //! [geocode0]
            Address {
                id: fromAddress
                city: ""
                country: ""
                street: ""
                postalCode: ""
            } //fromAddress
            //! [geocode0]

            Address {
                id: toAddress
                country: ""
                city: ""
                street: ""
                postalCode: ""
            } //toAddress



         } //Map
    } //mapRectangleID

    Button {
        id: btn_close
        width: 100
        height: 20
        text: "Close"

        onClicked: {
           Qt.quit();
        }
    }

    Button {
        id: btn_routing
        width: 100
        height: 20
        x:100
        text: "Routing"

        onClicked: {
             routingMenu.open();
        }
    }

    Button {
        id: btn_oldWay
        width: 100
        height: 20
        x:200
        text: "Old way"

        onClicked: {
             oldWayMenu.open();
        }
    }

    Button {
        id: rest
        width: parent.width - x
        height: 20
        x:300
        text: ""

        onClicked: {
        }
    }
} //ApplicationWindow

Я попробовал 2 способа решить проблему.Один с загрузчиком, но я не могу открыть свое меню, а другой с примером QT, который находится в примере MapViewer.Они импортируют только заказ и используют идентификатор компонента.Но это не работает.Я думаю, что я делаю что-то не так в своем коде, кто-то может сказать мне, что я делаю неправильно, или показать мне правильный способ решения моей проблемы.

Я думаю, что самая важная часть кода:

Loader {
        id: loadered
        focus: true
        source: "menu/menu.qml"
        active: true
    }

А потом, как я его использую:

Button {
    id: btn_routing
    width: 100
    height: 20
    x:100
    text: "Routing"

    onClicked: {
         routingMenu.open();
    }
}

По кнопке я использую имя компонента, потому что я импортировал меню.Но если я хочу использовать загрузчик, я бы установил видимое в загрузчике как false, а затем установил onClicked как true.Но я попробовал это, и это не сработало.

Спасибо за помощь DC

1 Ответ

0 голосов
/ 02 декабря 2018

Идентификатор действителен только внутри .qml, он не имеет смысла, например, допустим, вы собираетесь создать 4 меню, а затем, если бы вы использовали id routingMenu, к какому из меню вы бы обратились?потому что это может привести к путанице.Поэтому, если вы хотите использовать элемент, загруженный Loader , вы должны сделать это, используя свойство item .

Loader {
    id: loadered
    focus: true
    source: "menu/menu.qml"
    active: true
}
// ...

Button {
    id: btn_routing
    width: 100
    height: 20
    x:100
    text: "Routing"
    onClicked: loadered.item.open()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...