[Interest] Qt3D Fit in view

Mike Krus mike.krus at kdab.com
Fri Mar 10 10:42:36 CET 2023

> On 9 Mar 2023, at 22:00, Sean Murphy via Interest <interest at qt-project.org> wrote:
> I'm trying out the Qt 3D classes for the first time and am in need of a couple pointers.
> At a high level, I have the following:
> - 1 view, 1 scene, 1 camera, and 1 QOrbitCameraController
>  - in the scene, I create 7 entities, each a child of the root entity
>    - each of the entities contains a mesh that is sourced from a
>      corresponding .obj file
> Then my main window contains 7 radio buttons to toggle which entity is visible at any
> given time. The radio buttons are mutually exclusive, so the goal is that only one entity
> is visible at any time. I'm having two main issues with the setup so far:
> Issue 1: QEntity::setEnabled(false) doesn't seem to make the entity invisible
>  Each radio button is connected to a corresponding slot which just does the following:
>    void MainWindow::slotEntity1Toggled(bool checked)
>    {
>      qDebug() << __FUNCTION__ << checked;
>      Entity1 ->setEnabled(checked);
>    }
>  When the button becomes enabled (checked == true) the entity does in fact become
>  visible. But when the button is disabled (checked == false), the entity is still
>  visible in the view. If at that point I resize the application (and therefore the
>  view) then the old entity disappears. It appears I need the 3D version of a
>  repaint(), but so far I haven't found where that is (or even which class I should be
>  looking at). I did try explicitly calling repaint() on the QWidget that holds the
>  view, but that didn't force the 3D scene to re-render, so far I've only been able
>  to get it to redraw by resizing the widget.
>  From the qDebug() statement in there, I can see that this slot is getting called
>  as expected. Every time it's called with "true" the entity changes from
>  invisible->visible without requiring any window resizing. But every time this function
>  is called with "false", I have to resize the window to get the entity to disappear
unless you have setup your scene to be refresh ondemand (QRenderSettings::renderPolicy
set to QRenderSettings::OnDemand), Qt3D should constantly re-render.

Please provide more details on how the view is setup.

> Issue 2: Is there any sort of "fit in view" functionality for 3D views?
>  Since I'm only allowing the user to display one entity at a time, I'd like to be
>  able to automatically set the camera settings to zoom as needed to fit the entire
>  entity within the view, so the user doesn't have to manually zoom in/out as they
>  switch between entities.
>  I've used the 2D classes QGraphicsView & QGraphicsScene fairly extensively and I'm
>  used to using QGraphicsView::fitInView(QGraphicsItem*) and have the QGraphicsView set
>  the transform needed to fit that item within the view. I was hoping that Qt 3D has
>  something similar, but so far I haven't stumbled across it. I don't know enough about
>  the Qt 3D classes yet to know if there's some easy way to compute the correct transform
>  required to set this up?
>  The .obj files I'm playing around with have VASTLY different scale factors so a
>  camera setting for one entity often doesn't work well for another.
There’s relevant methods on the QCamera class.


> Other pertinent information:
> - Using Qt 5.15.2, but could switch to Qt 6 if required.
> - I would prefer to stick with QWidget & C++, not QML
> - I'm extremely new to Qt 3D, OpenGL, etc. so go ahead and make the assumption that
>   I know nothing about anything in that realm. It's an accurate assumption, and I won't
>   be offended!
> Thanks,
> Sean
> This e-mail, including any attached files, may contain confidential information, privileged information and/or trade secrets for the sole use of the intended recipient. Any review, use, distribution, or disclosure by others is strictly prohibited. If you are not the intended recipient (or authorized to receive information for the intended recipient), please contact the sender by reply e-mail and delete all copies of this message.
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest

Mike Krus | mike.krus at kdab.com | Senior Software Engineer & Teamlead
KDAB (UK) Ltd., a KDAB Group company
Tel: UK Office +44 1625 809908   Mobile +44 7833 491941
KDAB - The Qt Experts, C++, OpenGL Experts

More information about the Interest mailing list