Ds
Deymos sAug. 19, 2020, 5:31 a.m.

Область видимости QML

Здравствуйте, у меня возникла проблема с видимостью переменных из main.qml в других файлах, у меня stackView находится в main а кнопка, с помощью которой нужно перейти на страницу, находится на странице Page1, и вот на первой картинке показываю: ввожу id StackView и никакой реакции, хотя со страницы SettingsPage доступны все элементы из main и подсвечиваются светло синим (2 картинка), а со всех остальных страниц ничего не доступно, хотелось бы понять почему так и как с этим бороться?

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!

16
Ds
  • Aug. 19, 2020, 5:32 a.m.

дизайнер не использовал, просто не было варианта без дизайнера, и после создания проекта убрал *.ui из названия, но Page1Form и Page2Form названия не менял.

    Evgenii Legotckoi
    • Aug. 19, 2020, 11:40 a.m.

    Добрый день.
    Если страницы добавляются динамически в StackView через push, то добавляемые страницы никак не могут спарсится правильно для подсветки кода в QtCreator, поскольку id stackView в этом случае может соответствовать чему угодно, хоть координате на орбите Марса.
    Так что, если у вас сама программа работает, то просто забудьте. Это проблема парсинга QML для динамически создаваемых в рантайме объектов. Парсер подсветки синтаксиса никогда не сможет правильно определить соответствие некоторых id в этом случае.

      Ds
      • Aug. 19, 2020, 12:01 p.m.

      нет, дело не в подсветке, вот на первом фото моё приложение, и там круглая красная кнопка

      на втором фото, её описание как round button

      и вот на третьем StackView который обьявлен в main, и который доступен почему то только для SettingsPage, все остальные страницы не могут например якоря ставить по id обьектов из других файлов, например у меня topBar в мейне обьявлен,а я хочу список иза Page1Form к его низу заякорить, но сделать этого не могу потому что нет возможности у всех страниц кроме settingsPage использовать обьекты друг друга по их id.

        Ds
        • Aug. 19, 2020, 12:04 p.m.

        и вот так же с StackView, оно просто недоступно для других страниц, и неизвестно почему. Возможно можно через сигналы-слоты, но не особо понимаю как, возможно stackview инстанцировать, ну а возможно это просто баг, поэтмоу и спросил, ну не может быть такого чтобы не было доступа к внутреннему id обьектов из других файлов.

          Evgenii Legotckoi
          • Aug. 20, 2020, 6:03 a.m.

          На самом деле может так быть, что id из других файлов будет недоступен или не будет срабатывать.
          Тут ещё другая проблема. Страницы загружаются внутрь stackview и привязывать якорями к объектам вне stackview уже не получится.
          У тому же для якорей есть правило, что их можно привязывать либо к parent объектам, либо к sibling объектам. Обычно в таком случае будет следующая ошибка

          QML Rectangle: Cannot anchor to an item that isn't a parent or sibling.

          Но опять же не всегда. Также скорее всего может быть проблема в рантайме с использованием якорей через id. Например такая проблема есть в следующем коде

          import QtQuick 2.9
          import QtQuick.Window 2.2
          
          Window {
              id: mainWindow
              visible: true
              width: 640
              height: 480
              title: qsTr("Hello World")
          
              Rectangle {
                  id: rect_1
                  color: "red"
                  width: 100
                  height: 100
          
                  anchors {
                      top: mainWindow.top // Якорь top не сработает, и при этом не сообщит об ошибке
                      topMargin: 50
                      left: parent.left // При этом если обращаться через parent, то сработает
                      leftMargin: 50
                  }
              }
          
              Rectangle {
                  id: rect_2
                  color: "green"
                  width: 100
                  height: 100
          
                  anchors {
                      top: parent.top
                      topMargin: 50
                      right: parent.right
                      rightMargin: 50
                  }
          
                  Rectangle {
                      id: rect_3
                      color: "blue"
                      width: 30
                      height: 30
          
                      anchors {
                          top: rect_1.top // Этот якорь не сработает, поскольку rect_1 не является ни parent, ни sibling объектом
                      }
                  }
              }
          }
          
          

          Думаю, что у вас подобная ситуация. Страница, которую загружаете в StackView может использовать якоря только внутри самого stackView либо с братскими объектами, которых естественно в stackView нет.

            Ds
            • Aug. 20, 2020, 6:20 a.m.

            ну с якорями не так остро проблема стоит, хотелось бы узнать как привязать всё же кнопку к StackView который находится в мейне и недоступен странице с кнопкой, либо как то передать этот stackView на страницу с кнопкой, чтобы просто можно было сделать push оттуда

              Evgenii Legotckoi
              • Aug. 20, 2020, 6:37 a.m.
              • (edited)
              • The answer was marked as a solution.

              Ну у меня есть мысль насчёт доступа через attached property.

              Добавьте в корневой элемент Page1Form.qml id, например id: root

              И потом вызывайте в кнопке код следующим образом

              root.StackView.view.push("qrc:/addingPage.qml")
              
                Ds
                • Aug. 20, 2020, 6:43 a.m.

                Спасибо большое, но я всё же не понимаю почему в qml такое происходит, и почему ни у кого с этим вопросов не возникало, возможно я где то накосячил.

                  Evgenii Legotckoi
                  • Aug. 20, 2020, 6:51 a.m.

                  На самом деле вопросы возникают, просто как правило вариации этих вопросов самые разные.
                  А из SettingsPage есть доступ к StackView потому, что вы SettingsPage прописываете натвердо, без динамического создания в рантайме.
                  Если бы вы добавляли SettingsPage в StackView через push, то столкнулись бы с такой же проблемой, как и у остальных страниц.

                    Ds
                    • Aug. 20, 2020, 6:55 a.m.

                    ну у меня SettingsPage пушится из мейна когда нажимаю на три точки сверху и вызываю настройки

                    ну и если я всё правильно сделал, то всё же не получается добиться переходи на страницу, возможно есть ещё варианты? может как то это сделать через синглтон? может через сигналы слоты? В qt я с ними много работал, но я не уверен есть ли они в qml,

                      Evgenii Legotckoi
                      • Aug. 20, 2020, 7:01 a.m.
                      • (edited)

                      Добавляйте программный код текстом, а не изображением. В тулбаре редатора сообщений есть диалог, который сразу расставит нужную разметку для вставок программного кода.

                      И у вас в main.qml чёрным по белому написан такой код

                      SettingsPage {
                          id: settPage
                      }
                      

                      Не вижу никакого push в stackView в том, что вы привели в сообщениях.

                        Ds
                        • Aug. 20, 2020, 7:06 a.m.

                        Я понял, я сделал в мейне так:

                            Page1Form {
                                id: pg1Form
                            }
                        

                        И всё стало доступно в Page1Form, аж стыдно что так долго выяснял в чём проблема, ну может кому то полезно будет, спасибо большое за помощь.

                          Evgenii Legotckoi
                          • Aug. 20, 2020, 7:09 a.m.

                          В данном случае SettingsPage и Page1Form будут sibling объектами относительно stackView.

                          Просто StackView их перекрывает, поскольку объявлен позже.

                          Предполагаю, что у вас могут начаться проблемы при выполнении pop() . Объекты будут убираться из StackView, но не уничтожаться... Даже и не знаю, как поведёт QML себя в этом случае. Один чёрт, такой подход так себе.

                            Ds
                            • Aug. 20, 2020, 7:14 a.m.

                            пока у меня 4 страницы, проблем не возникает, если всё же возникнут, отпишу сюда что способ не рабочий, пока что не вижу просто других, если что найду получше, тоже отпишу.

                              Ds
                              • Aug. 21, 2020, 11:38 a.m.

                              Да, вы были правы, stackview просто перекрывает страницы, и они висят позади, когда мне из addingPage нужно было передать данные по нажатию кнопки, чтобы динамически создать строку с занятием, я так же обьявил в AddingPage Page1Form и увидел что эти страницы просто смешались, поэтому такой подход не имеет места быть.

                                Ds
                                • Aug. 21, 2020, 3:19 p.m.

                                похоже нашёл решение в моём случае оно выглядит так

                                Component {
                                        id: mainPg
                                        Page1Form {}
                                    }
                                    Component {
                                        id: addingPg
                                        AddingPage {}
                                    }
                                    Component {
                                        id: settingsPg
                                        SettingsPage {}
                                    }
                                    Component {
                                        id: achivementPg
                                        SettingsPage {}
                                    }
                                    StackView {
                                        id: stackView
                                        anchors.fill: parent
                                        initialItem: mainPg
                                        }
                                

                                так же ссылка откуда взял это:
                                https://doc.qt.io/qt-5/qml-qtquick-controls2-stackview.html#item-ownership

                                  Comments

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

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

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

                                  C++ - Test 002. Constants

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

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

                                  • Result:73points,
                                  • Rating points1
                                  Last comments
                                  k
                                  kmssrFeb. 8, 2024, 3:43 p.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, 7:30 a.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, 5:38 a.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. 18, 2023, 6:01 p.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, 2:46 a.m.
                                  Clipboard Как скопировать окно целиком в clipb?
                                  DA
                                  Dr Gangil AcademicsApril 20, 2024, 4:45 a.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, 3:41 a.m.
                                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                  Павел Дорофеев
                                  Павел ДорофеевApril 13, 2024, 11:35 p.m.
                                  QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                  f
                                  fastrexApril 4, 2024, 1:47 a.m.
                                  Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                                  Follow us in social networks