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
                                  i
                                  innorwallNov. 11, 2024, 10:12 p.m.
                                  Django - Tutorial 055. How to write auto populate field functionality Freckles because of several brand names retin a, atralin buy generic priligy
                                  i
                                  innorwallNov. 11, 2024, 6:23 p.m.
                                  QML - Tutorial 035. Using enumerations in QML without C ++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                                  i
                                  innorwallNov. 11, 2024, 3:50 p.m.
                                  Qt/C++ - Lesson 052. Customization Qt Audio player in the style of AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                                  i
                                  innorwallNov. 11, 2024, 2:19 p.m.
                                  Heap sorting algorithm The role of raloxifene in preventing breast cancer priligy precio
                                  i
                                  innorwallNov. 11, 2024, 1:55 p.m.
                                  PyQt5 - Lesson 006. Work with QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                                  Now discuss on the forum
                                  i
                                  innorwallNov. 11, 2024, 8:56 p.m.
                                  добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                                  i
                                  innorwallNov. 11, 2024, 10:55 a.m.
                                  Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                  9
                                  9AnonimOct. 25, 2024, 9:10 a.m.
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                  Follow us in social networks