Ds
Deymos s19 августа 2020 г. 5:31

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
Ds
  • 19 августа 2020 г. 5:32

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

    Evgenii Legotckoi
    • 19 августа 2020 г. 11:40

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

      Ds
      • 19 августа 2020 г. 12:01

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

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

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

        Ds
        • 19 августа 2020 г. 12:04

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

          Evgenii Legotckoi
          • 20 августа 2020 г. 6:03

          На самом деле может так быть, что 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
            • 20 августа 2020 г. 6:20

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

              Evgenii Legotckoi
              • 20 августа 2020 г. 6:37
              • (ред.)
              • Ответ был помечен как решение.

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

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

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

              root.StackView.view.push("qrc:/addingPage.qml")
              
                Ds
                • 20 августа 2020 г. 6:43

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

                  Evgenii Legotckoi
                  • 20 августа 2020 г. 6:51

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

                    Ds
                    • 20 августа 2020 г. 6:55

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

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

                      Evgenii Legotckoi
                      • 20 августа 2020 г. 7:01
                      • (ред.)

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

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

                      SettingsPage {
                          id: settPage
                      }
                      

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

                        Ds
                        • 20 августа 2020 г. 7:06

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

                            Page1Form {
                                id: pg1Form
                            }
                        

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

                          Evgenii Legotckoi
                          • 20 августа 2020 г. 7:09

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

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

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

                            Ds
                            • 20 августа 2020 г. 7:14

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

                              Ds
                              • 21 августа 2020 г. 11:38

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

                                Ds
                                • 21 августа 2020 г. 15:19

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

                                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

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  AD

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:50баллов,
                                  • Очки рейтинга-4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 1:37

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:80баллов,
                                  • Очки рейтинга4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 1:29

                                  C++ - Тест 004. Указатели, Массивы и Циклы

                                  • Результат:20баллов,
                                  • Очки рейтинга-10
                                  Последние комментарии
                                  i
                                  innorwall13 ноября 2024 г. 23:03
                                  Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
                                  i
                                  innorwall13 ноября 2024 г. 20:09
                                  Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
                                  i
                                  innorwall11 ноября 2024 г. 22:12
                                  Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                                  i
                                  innorwall11 ноября 2024 г. 18:23
                                  QML - Урок 035. Использование перечислений в QML без 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
                                  innorwall11 ноября 2024 г. 15:50
                                  Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле 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
                                  innorwall14 ноября 2024 г. 0:39
                                  добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
                                  i
                                  innorwall11 ноября 2024 г. 10:55
                                  Всё ещё разбираюсь с кешем. 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
                                  9Anonim25 октября 2024 г. 9:10
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                  ИМ
                                  Игорь Максимов3 октября 2024 г. 4:05
                                  Реализация навигации по разделам Спасибо Евгений!

                                  Следите за нами в социальных сетях