qml_puthon_user
Dec. 3, 2019, 12:36 p.m.

Как в QML форму добавить 3D объект.

Всем доброго времени суток!
Я пишу интерфейс для пользователя и в него мне нужно добавить вращающийся 3д объект.
Как я понял, на python ещё нет QtQuick3D, поэтому пользовался Qt3D.
Для примера написал код из видео.
Qt3D QML Tutorial 1. Шаблон проекта / Project template

Написал код:

  1. import QtQuick 2.12
  2. import QtQuick.Controls 2.12
  3. import QtQuick.Layouts 1.3
  4. import Qt3D.Core 2.0
  5. import Qt3D.Input 2.0
  6. import Qt3D.Render 2.0
  7. import Qt3D.Logic 2.0
  8. import Qt3D.Extras 2.0
  9.  
  10. ApplicationWindow{
  11. id:general_win
  12. visible: true
  13. width: 1680
  14. height: 920
  15. title: qsTr("Test title")
  16.  
  17. Rectangle
  18. {
  19. id: mainwindow
  20. width: 640
  21. height: 480
  22. color: "green"
  23.  
  24. Entity
  25. {
  26. id: rootEntity
  27.  
  28. Camera
  29. {
  30. id: mainCamera
  31. projectionType: CameraLens.PerspectiveProjection
  32. fieldOfView: 60.0
  33. aspectRatio: 16.0 / 9.0
  34. nearPlane: 0.1
  35. farPlane: 1000.0
  36. position: Qt.vector3d(0.0, 0.0, 40.0)
  37. upVector: Qt.vector3d(0.0, 1.0, 0.0)
  38. viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
  39. }
  40.  
  41. TorusMesh
  42. {
  43. id: torusMesh
  44. radius: 15.0
  45. minorRadius: 6.0
  46. slices: 16
  47. rings: 32
  48. }
  49.  
  50. PhongMaterial
  51. {
  52. id: torusMaterial
  53. }
  54.  
  55. Transform
  56. {
  57. id: torusTransform
  58. translation: Qt.vector3d(0.0, 0.0, 0.0)
  59. }
  60.  
  61. components:
  62. [
  63. RenderSettings
  64. {
  65. activeFrameGraph: ForwardRenderer
  66. {
  67. clearColor: Qt.rgba(1, 1, 1, 1)
  68. camera: mainCamera
  69. }
  70. },
  71. InputSettings {}
  72. ]
  73.  
  74. Entity
  75. {
  76. id: torusEntity
  77. components: [torusMesh, torusMaterial, torusTransform]
  78. }
  79. }
  80. }
  81. }

Скрипт python который вызывает форму:

  1. from PyQt5.QtGui import QGuiApplication
  2. from PyQt5.QtQml import QQmlApplicationEngine
  3. from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
  4.  
  5. if __name__ == "__main__":
  6. import sys
  7.  
  8. # создаём экземпляр приложения
  9. app = QGuiApplication(sys.argv)
  10. # создаём QML движок
  11. engine = QQmlApplicationEngine()
  12.  
  13. # загружаем файл qml в движок
  14. engine.load("Interface_vr_eyes.qml")
  15.  
  16. engine.quit.connect(app.quit)
  17. sys.exit(app.exec_())
  18.  

В конечном итоге, окно приложения отображается, зелёный прямоугольник отображается в нём, а вот 3д объект, который создаётся из видео-урока не появляется на экране. Подскажите, в чём может быть проблема?
P.S. а точно ли нет QtQuick3D для питона? Если есть, подскажите.
P.S.S ещё хотел бы знать, как загрузить свою модель сделанную в КОМПАС-3D/Blender3D. На этот вопрос ответ увидел, да, загружать модель из Blender3d в расширении obj можно.

Увидел в видео, что код вызова qml файла тоже немного переписан... Там создаётся уже как бы сцена для 3д объекта, а мне нужно вставить 3д обект в главную форму получается...
Что-то типа...

  1. import QtQuick 2.12
  2. import ... (т.д.)
  3.  
  4. //главное окно программы
  5. ApplicationWindow
  6. {
  7. id:general_win
  8. visible: true
  9. width: 1680
  10. height: 920
  11. title: qsTr("Test title")
  12.  
  13. //label
  14. //button
  15. //image
  16. //и т.д.
  17.  
  18. //блок с вращающейся 3д моделью
  19. Rectangle
  20. {
  21. id: mainwindow
  22. width: 640
  23. height: 480
  24. color: "green"
  25.  
  26. //описание видимости 3д модели
  27. }
  28.  
  29. }

Спасибо!

2

Do you like it? Share on social networks!

11
Evgenii Legotckoi
  • Dec. 3, 2019, 4:50 p.m.

Так там не используется QML, но могу предположить, что у вас не установлен PyQt5.Qt3DCore и остальные соответствующие библиотеки

    qml_puthon_user
    • Dec. 3, 2019, 5:04 p.m.

    Установлено

    Устанавливал через pip3 install pyqt3d

      qml_puthon_user
      • Dec. 3, 2019, 5:06 p.m.
      • (edited)

      Да, в примере не используется QML, подумал, что от туда хоть как-то можно оттолкнуться.
      Если из видео, в первом сообщении, пример рабочий для python. То проблема стоит в том, что я не могу вызвать qml файл из python.

        qml_puthon_user
        • Dec. 3, 2019, 7:01 p.m.
        • (edited)

        У меня даже нет предложения о "setSource", как в видео...

        setSource наблюдаю пока что только в QSceneLoader()

          qml_puthon_user
          • Dec. 3, 2019, 7:54 p.m.

          Реализация безнадёжна? :)

            Evgenii Legotckoi
            • Dec. 3, 2019, 7:57 p.m.
            • (edited)

            У нас с вами разница во времени скорее всего достаточно большая, поскольку я в Праге проживаю. Так что не кипишуйте. Мне сегодня ещё долго работать. Да и тут узнал, что вечером корпоратив, даты которого я перепутал. Так что наберитесь терпения )))

              qml_puthon_user
              • Dec. 3, 2019, 8:06 p.m.

              Пардон.) Буду ждать и экспериментировать.)

                qml_puthon_user
                • Dec. 3, 2019, 11:18 p.m.

                Полазил я по файлам Qt Design Studio, нашёл там библиотеку QtQuick3D и остальные. Сверил с файлами, которые есть у самого питона в site-packages и увидел, что да, у питона нет папки QtQuick3D. Как я понял, для вызова этой библиотеки нужен файл питона с расширением .pyd, который может называться QtQuick3D.pyd(почему так? решил из того, что есть файл QtQuick.pyd :)).

                Я не смог осилить написать зависимости, чтобы на питоне запустить QtQuick3D. Если хотите, можете попробовать. :) А так, остаётся ждать от разработчика Riverbank.
                Riverbank | Software | PyQt | What is PyQt?

                  Evgenii Legotckoi
                  • Dec. 5, 2019, 2:38 a.m.
                  • The answer was marked as a solution.

                  Я посмотрел то видео, и сравнил с вашим кодом. У вас не запускается 3D потому, что вы не используете Qt3DQuickWindow, а используете обычный QML engine. В этом проблема, чтобы вообще 3D заработало. Но вашем случае это не получится запустить потому, что Qt3DQuickWindow отсутствует в PyQt5. Так что нужно изучать C++ ;-)

                    qml_puthon_user
                    • Dec. 5, 2019, 9:07 a.m.

                    Спасибо за помощь! :) Я попытаю надежды в ожидании QtQuick3D от Riverbank'a. :)

                      Comments

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      • Last comments
                      • AK
                        April 1, 2025, 11:41 a.m.
                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                      • Evgenii Legotckoi
                        March 9, 2025, 9:02 p.m.
                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                      • VP
                        March 9, 2025, 4:14 p.m.
                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                      • ИМ
                        Nov. 22, 2024, 9:51 p.m.
                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      • Evgenii Legotckoi
                        Oct. 31, 2024, 11:37 p.m.
                        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup