qml_puthon_user
qml_puthon_user3 декабря 2019 г. 12:36

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

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

Написал код:

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.3
import Qt3D.Core 2.0
import Qt3D.Input 2.0
import Qt3D.Render 2.0
import Qt3D.Logic 2.0
import Qt3D.Extras 2.0

ApplicationWindow{
    id:general_win
    visible: true
    width: 1680
    height: 920
    title: qsTr("Test title")

    Rectangle 
    {
        id: mainwindow
        width: 640
        height: 480
        color: "green"

        Entity 
        {
            id: rootEntity

            Camera 
            {
                id: mainCamera
                projectionType: CameraLens.PerspectiveProjection
                fieldOfView: 60.0
                aspectRatio: 16.0 / 9.0
                nearPlane: 0.1
                farPlane: 1000.0
                position: Qt.vector3d(0.0, 0.0, 40.0)
                upVector: Qt.vector3d(0.0, 1.0, 0.0)
                viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
            }

            TorusMesh 
            {
                id: torusMesh
                radius: 15.0
                minorRadius: 6.0
                slices: 16
                rings: 32
            }

            PhongMaterial
            {
                id: torusMaterial
            }

            Transform
            {
                id: torusTransform
                translation: Qt.vector3d(0.0, 0.0, 0.0)
            }

            components: 
            [
                RenderSettings
                {
                    activeFrameGraph: ForwardRenderer
                    {
                        clearColor: Qt.rgba(1, 1, 1, 1)
                        camera: mainCamera
                    }
                },
                InputSettings {}
            ]

            Entity
            {
                id: torusEntity
                components: [torusMesh, torusMaterial, torusTransform]
            }
        }
    }
}

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

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot

if __name__ == "__main__":
    import sys

    # создаём экземпляр приложения
    app = QGuiApplication(sys.argv)
    # создаём QML движок
    engine = QQmlApplicationEngine()

    # загружаем файл qml в движок
    engine.load("Interface_vr_eyes.qml")

    engine.quit.connect(app.quit)
    sys.exit(app.exec_())

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

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

import QtQuick 2.12
import ... (т.д.)

//главное окно программы
ApplicationWindow
{
    id:general_win
    visible: true
    width: 1680
    height: 920
    title: qsTr("Test title")

    //label
    //button
    //image
    //и т.д.

    //блок с вращающейся 3д моделью
    Rectangle
    {
        id: mainwindow
        width: 640
        height: 480
        color: "green"

        //описание видимости 3д модели
    }

}

Спасибо!

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

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

11
Evgenii Legotckoi
  • 3 декабря 2019 г. 16:50

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

    qml_puthon_user
    • 3 декабря 2019 г. 17:04

    Установлено

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

      qml_puthon_user
      • 3 декабря 2019 г. 17:06
      • (ред.)

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

        qml_puthon_user
        • 3 декабря 2019 г. 19:01
        • (ред.)

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

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

          qml_puthon_user
          • 3 декабря 2019 г. 19:54

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

            Evgenii Legotckoi
            • 3 декабря 2019 г. 19:57
            • (ред.)

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

              qml_puthon_user
              • 3 декабря 2019 г. 20:06

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

                qml_puthon_user
                • 3 декабря 2019 г. 23:18

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

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

                  Evgenii Legotckoi
                  • 5 декабря 2019 г. 2:38
                  • Ответ был помечен как решение.

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

                    qml_puthon_user
                    • 5 декабря 2019 г. 9:07

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

                      Комментарии

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

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:84баллов,
                      • Очки рейтинга4
                      Ua

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:42баллов,
                      • Очки рейтинга-8
                      ОК

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:47баллов,
                      • Очки рейтинга-6
                      Последние комментарии
                      ИМ
                      Игорь Максимов22 ноября 2024 г. 21:51
                      Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      Evgenii Legotckoi
                      Evgenii Legotckoi31 октября 2024 г. 23:37
                      Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                      A
                      ALO1ZE19 октября 2024 г. 17:19
                      Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов5 октября 2024 г. 16:51
                      Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas55 июля 2024 г. 20:02
                      QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      Сейчас обсуждают на форуме
                      f
                      firstlunoxod15 февраля 2025 г. 13:46
                      Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                      Дмитрий
                      Дмитрий3 февраля 2025 г. 16:24
                      Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                      NW
                      Nayo Wai30 января 2025 г. 19:22
                      не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                      n
                      nkly3 января 2025 г. 12:52
                      Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                      M
                      Marsel17 августа 2023 г. 0:26
                      OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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