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
                                  AD

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

                                  • Result:50points,
                                  • Rating points-4
                                  m

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

                                  • Result:80points,
                                  • Rating points4
                                  m

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

                                  • Result:20points,
                                  • Rating points-10
                                  Last comments
                                  ИМ
                                  Игорь МаксимовNov. 22, 2024, 7:51 p.m.
                                  Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiOct. 31, 2024, 9:37 p.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZEOct. 19, 2024, 3:19 p.m.
                                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь МаксимовOct. 5, 2024, 2:51 p.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas5July 5, 2024, 6:02 p.m.
                                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  Now discuss on the forum
                                  m
                                  moogoNov. 22, 2024, 3:17 p.m.
                                  Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiJune 24, 2024, 10:11 p.m.
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  t
                                  tonypeachey1Nov. 15, 2024, 2:04 p.m.
                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                  NSProject
                                  NSProjectJune 4, 2022, 10:49 a.m.
                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                  Follow us in social networks