alex_lip
alex_lipFeb. 20, 2018, 3:10 a.m.

Разбить один qml файл на несколько составляющих

Основная форма проекта на QML разрослась. Хочется объекты, которые я использую на форме разбить на отдельные qml файлы для удобства просмотра и отладки. Например
Диалог, который вызывается в форме я перенес в другой файл и назвал его send_chat.qml.

   Dialog {
                                    id: dialog_chat
                                    title: "Текст сообщения"
                                    contentItem: Rectangle {
                                        color: "ivory"
                                        border.color: "orange"
                                        implicitWidth: mydocPage.width
                                        implicitHeight: mydocPage.height/2
                                  }
               }
Все qml файлы лежат в папке content.В начале основного Qml файла поместил директиву
import "content"  
А что делать дальше? Как мне сказать в основном файле - загрузи send_chat.qml
пробовал

import "../content/send_chat.qml"
тоже не находит.

import "/content/send_chat.qml"
пишет import "/content/send_chat.qml" has no qmldir and no namespace

Хотя в файле меню использую лоадер для динамической загрузки - все грузится

            TextButton {
                id:doc_chat
                anchors.left: parent.left
                anchors.right: parent.right

                text: qsTr("Написать помощнику")
                smooth: false
                onClicked: {
                    loader.source = "/content/chat.qml"
                    drawer.close()
                }
            }
Но мне не нужна динамическая загрузка. Мне нужно разделить один qml файл на несколько (по объектно) только для удобства просмотра.







We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

11
Evgenii Legotckoi
  • Feb. 20, 2018, 3:32 a.m.
  • The answer was marked as a solution.

Здесь есть один нюанс в именовании файлов. Если Вы что-то выделяете в отдельный файл и пытаетесь его импортировать, то это что-то считается Типом QML и файл должен именоваться с большой буквы и CamelCase стиле. То есть переименуйте следующим образом.


SendChatDialog.qml

И второй момент, импортирование файлов QML в данном случае производится в качестве всего каталога, то есть каталог будет пространство имён в данном случае.
импорт нужно делать так тогда
import "content/"
В результате это будет выглядеть так
import QtQuick 2.8
import QtQuick.Window 2.2

import "content/"

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    SendChatDialog {

    }
}
    alex_lip
    • Feb. 20, 2018, 4 a.m.

    Спасибо получилось. Только чтобы вызвать диалог надо ему id присвоить именно в основном файле.

    SendChatDialog {
      id: ttt_id
        }
    Тот id который существует в файле

    SendChatDialog.qml
    недоступен.


      alex_lip
      • Feb. 20, 2018, 4:02 a.m.

      не знаю как пометить что вопрос решён...

        Evgenii Legotckoi
        • Feb. 20, 2018, 4:07 a.m.

        У ответов пользователей справа в нижнем углу есть галочка, которая помечает правильный ответ.
        И да, id будет недоступен извне.

          alex_lip
          • Feb. 20, 2018, 5:01 a.m.

          галочка не видна. нажал наугад

            Evgenii Legotckoi
            • Feb. 20, 2018, 5:07 a.m.

            Странно, видимо у вас не обновились некоторые стили после моего последнего апдейта.

            Находясь на сайте нажмите последовательно следующие комбинации клавиш.
            ALT+R и ALT+F5
            Это должно будет обновить кешированные стили
              alex_lip
              • Feb. 20, 2018, 7:32 a.m.

              Теперь проблема вылезла - как передать данные из одного файла в другой. Раньше объекты видели друг друга. Теперь нет.

                Evgenii Legotckoi
                • Feb. 20, 2018, 7:46 a.m.

                Можно объявлять функции

                Item {
                    id: root
                    property int someVariable;
                
                    function setSomeVariable(variable)
                    {
                        root.someVariable = variable;
                    }
                }
                И вызывать их извне через id
                myItem.setSomeVariable(12);
                Или через алиасы, как сделано в этой статье для InfoBar .

                Вам нужно понимать, что каждый QML файл в рамках QML считается не частью какого-то скрипта как в JavaScript или PHP.
                Каждый QML файл является описанием типа QML, то есть это аналогично классу в C++, поэтому здесь нужно отталкиваться от ООП.
                  alex_lip
                  • Feb. 20, 2018, 8 a.m.

                  а почему myItem.set ..?  A не Item.set.. или root.set  ? Где Вы myItem объявили?

                    Evgenii Legotckoi
                    • Feb. 20, 2018, 8:03 a.m.

                    Да нигде... это просто пример, если объект имеет у вас какой-нибудь id. Обращаться же по id будете извне.

                    SendChatDialog {
                      id: ttt_id
                        }
                    И где нибудь в коде вызвать, где объявлен добавлен этот диалог
                    ttt_id.setSomeVariable(12);
                    Так понятней будет?
                      alex_lip
                      • Feb. 20, 2018, 8:18 a.m.

                      Да спасибо. Просто после необходимости специфичных названий для файла - стараюсь обращать внимание на любую мелочь.

                        Comments

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        d
                        • dsfs
                        • April 26, 2024, 2:56 p.m.

                        C ++ - Test 004. Pointers, Arrays and Loops

                        • Result:80points,
                        • Rating points4
                        d
                        • dsfs
                        • April 26, 2024, 2:45 p.m.

                        C++ - Test 002. Constants

                        • Result:50points,
                        • Rating points-4
                        d
                        • dsfs
                        • April 26, 2024, 2:35 p.m.

                        C++ - Test 001. The first program and data types

                        • Result:73points,
                        • Rating points1
                        Last comments
                        k
                        kmssrFeb. 9, 2024, 5:43 a.m.
                        Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        EVA
                        EVADec. 25, 2023, 9:30 p.m.
                        Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                        J
                        JonnyJoDec. 25, 2023, 7:38 p.m.
                        Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                        G
                        GvozdikDec. 19, 2023, 8:01 a.m.
                        Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                        Now discuss on the forum
                        G
                        GarApril 22, 2024, 3:46 p.m.
                        Clipboard Как скопировать окно целиком в clipb?
                        DA
                        Dr Gangil AcademicsApril 20, 2024, 5:45 p.m.
                        Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                        a
                        a_vlasovApril 14, 2024, 4:41 p.m.
                        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                        Павел Дорофеев
                        Павел ДорофеевApril 14, 2024, 12:35 p.m.
                        QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                        f
                        fastrexApril 4, 2024, 2:47 p.m.
                        Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                        Follow us in social networks