Ds
Deymos s19. August 2020 05:31

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

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

16
Ds
  • 19. August 2020 05:32

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

    Evgenii Legotckoi
    • 19. August 2020 11:40

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

      Ds
      • 19. August 2020 12:01

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

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

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

        Ds
        • 19. August 2020 12:04

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

          Evgenii Legotckoi
          • 20. August 2020 06: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. August 2020 06:20

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

              Evgenii Legotckoi
              • 20. August 2020 06:37
              • (bearbeitet)
              • Die Antwort wurde als Lösung markiert.

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

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

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

              root.StackView.view.push("qrc:/addingPage.qml")
              
                Ds
                • 20. August 2020 06:43

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

                  Evgenii Legotckoi
                  • 20. August 2020 06:51

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

                    Ds
                    • 20. August 2020 06:55

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

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

                      Evgenii Legotckoi
                      • 20. August 2020 07:01
                      • (bearbeitet)

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

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

                      SettingsPage {
                          id: settPage
                      }
                      

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

                        Ds
                        • 20. August 2020 07:06

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

                            Page1Form {
                                id: pg1Form
                            }
                        

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

                          Evgenii Legotckoi
                          • 20. August 2020 07:09

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

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

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

                            Ds
                            • 20. August 2020 07:14

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

                              Ds
                              • 21. August 2020 11:38

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

                                Ds
                                • 21. August 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

                                  Kommentare

                                  Nur autorisierte Benutzer können Kommentare posten.
                                  Bitte Anmelden oder Registrieren
                                  Letzte Kommentare
                                  ИМ
                                  Игорь Максимов5. Oktober 2024 07:51
                                  Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas55. Juli 2024 11:02
                                  QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  k
                                  kmssr8. Februar 2024 18:43
                                  Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  EVA
                                  EVA25. Dezember 2023 10:30
                                  Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                  Jetzt im Forum diskutieren
                                  J
                                  JacobFib17. Oktober 2024 03:27
                                  добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                                  JW
                                  Jhon Wick1. Oktober 2024 15:52
                                  Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                                  КГ
                                  Кирилл Гусарев27. September 2024 09:09
                                  Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                                  F
                                  Fynjy22. Juli 2024 04:15
                                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                                  Folgen Sie uns in sozialen Netzwerken