Как в 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д модели
- }
- }
Спасибо!
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Нашёл некий рабочий(почти) пример.
Что не так с механизмом обратного вызова в PyQt5.Qt3DCore с использованием примера QT
Так там не используется QML, но могу предположить, что у вас не установлен PyQt5.Qt3DCore и остальные соответствующие библиотеки
Установлено

Устанавливал через pip3 install pyqt3d
Да, в примере не используется QML, подумал, что от туда хоть как-то можно оттолкнуться.
Если из видео, в первом сообщении, пример рабочий для python. То проблема стоит в том, что я не могу вызвать qml файл из python.
У меня даже нет предложения о "setSource", как в видео...
setSource наблюдаю пока что только в QSceneLoader()
Реализация безнадёжна? :)
У нас с вами разница во времени скорее всего достаточно большая, поскольку я в Праге проживаю. Так что не кипишуйте. Мне сегодня ещё долго работать. Да и тут узнал, что вечером корпоратив, даты которого я перепутал. Так что наберитесь терпения )))
Пардон.) Буду ждать и экспериментировать.)
Полазил я по файлам Qt Design Studio, нашёл там библиотеку QtQuick3D и остальные. Сверил с файлами, которые есть у самого питона в site-packages и увидел, что да, у питона нет папки QtQuick3D. Как я понял, для вызова этой библиотеки нужен файл питона с расширением .pyd, который может называться QtQuick3D.pyd(почему так? решил из того, что есть файл QtQuick.pyd :)).

Я не смог осилить написать зависимости, чтобы на питоне запустить QtQuick3D. Если хотите, можете попробовать. :) А так, остаётся ждать от разработчика Riverbank.
Riverbank | Software | PyQt | What is PyQt?
Я посмотрел то видео, и сравнил с вашим кодом. У вас не запускается 3D потому, что вы не используете Qt3DQuickWindow, а используете обычный QML engine. В этом проблема, чтобы вообще 3D заработало. Но вашем случае это не получится запустить потому, что Qt3DQuickWindow отсутствует в PyQt5. Так что нужно изучать C++ ;-)
Спасибо за помощь! :) Я попытаю надежды в ожидании QtQuick3D от Riverbank'a. :)