3 декабря 2019 г. 0: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

Так там не используется 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. :)

Комментарии

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

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

ГС
23 января 2020 г. 15:04
Галина Степанівна Шепелюк

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

  • Результат:10баллов,
  • Очки рейтинга-10
ГС
23 января 2020 г. 14:51
Галина Степанівна Шепелюк

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
M
23 января 2020 г. 3:28
Mitrider

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
Последние комментарии
21 января 2020 г. 13:12
Docent

Полезная статья. Как всегда - то что надо. Добавлю ещё маленькую полезность - после установки tracer (88 строка) и перед выводом значений в lineEdit (91 строка) стоит добавить updatePositio…
17 января 2020 г. 1:31
Андрей Янкович

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.
D
16 января 2020 г. 11:06
DENIZ1819

Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?
14 января 2020 г. 4:33
Евгений Легоцкой

Рекомендую Wt, достаточно мощная вещь. Этот фреймворк может использоваться для написания сайтов на C++, либо можно использовать только отдельный компоненты, например только ORM. Но я не знаю, ка…
a
14 января 2020 г. 4:29
ayb

Спасибо за инфу. Поиск качественной ORM привел меня только к sqlite_orm, но не подходит из-за необходимости полноценной поддержки c++14. Про framework Wt не слышал, спасибо за наводку.
Сейчас обсуждают на форуме
24 января 2020 г. 2:24
Евгений Легоцкой

Добрый день Попробуйте использовать метод deleteLater() у объектов Data . В этом случае удаление происзодит немного позже, но уже тогда, когда другие части программы…
24 января 2020 г. 1:37
Евгений Легоцкой

Не уверен. я бы попробовал выдернуть ссылки и забрать всё через QNetworkAccessManager, если вам не нужно запускать эти скрипты. Я с той ошибкой не сталкивался.
23 января 2020 г. 11:54
Intruder

Евгений, с удалением строк разобрался. Спасибо за помощь. Немного пришлось модернизировать код, но все получилось вроде.
22 января 2020 г. 5:06
Pavel.K

Можете попробовать через Loader сделать, те cделать свой компонент ректангл с нужными вам полями и через Loader вызывать этот компонент , а через Connections прописать что ваш компонент отрисова…
22 января 2020 г. 3:25
Pavel.K

Привет, кто-нибудь делал тестовый Json сервер , чтобы не просто через сокет ByteArray пересылать, а с клиента обрабатывать Post и get запросы? Буду очень признателен если у кого то есть пр…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB