You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Qt5.10+C++:将STL文件查看功能从QWindow迁移至QWidget

在QWidget中集成Qt3D STL查看器(支持Qt Designer)

我刚好做过类似的需求,其实核心就是用Qt提供的QWidget::createWindowContainer把Qt3DWindow包装成可嵌入QWidget布局的容器,这样就能完美适配Qt Designer的可视化设计了,具体步骤和代码示例如下:

1. 核心思路:把QWindow转成QWidget容器

Qt3DWindow是继承自QWindow的,没法直接放到QWidget的布局里,而createWindowContainer就是专门用来解决这个问题的——它能把任意QWindow包装成一个QWidget,让你像操作普通控件一样使用它。

2. 修改你的现有代码

基于你已经实现的QWindow版本代码,只需要加几行就能转成QWidget版本:

// 保留你原来的Qt3D初始化代码
Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;
view->setRootEntity(rootEntity);

Qt3DCore::QEntity *flyingwedge = new Qt3DCore::QEntity(rootEntity);
Qt3DExtras::QPhongMaterial *material = new Qt3DExtras::QPhongMaterial();
material->setDiffuse(QColor(200, 200, 200));
// ... 这里继续你的STL模型加载、实体挂载等已有代码

// 关键一步:把Qt3DWindow包装成QWidget
QWidget *qt3dWidget = QWidget::createWindowContainer(view, this);
// 设置自适应布局的大小策略,让它能跟着窗口缩放
qt3dWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

3. 在Qt Designer中集成

如果你想通过Designer可视化布局,按以下步骤操作:

  • 打开Qt Designer,拖一个普通QWidget到你的主窗口/对话框中,给它起个容易识别的名字(比如qt3dContainer
  • 回到代码中,把包装好的qt3dWidget添加到这个占位Widget的布局里:
// 假设这是你的主窗口构造函数
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // ... 上面的Qt3D初始化和包装代码

    // 给占位Widget设置布局,并添加Qt3D容器
    QVBoxLayout *containerLayout = new QVBoxLayout(ui->qt3dContainer);
    containerLayout->setContentsMargins(0, 0, 0, 0); // 去掉边距,让模型占满容器
    containerLayout->addWidget(qt3dWidget);
}

这样你就能在Designer里自由调整qt3dContainer的位置、大小,甚至和其他控件(比如按钮、滑块)一起布局了。

4. 注意事项

  • 确保你的项目.pro文件中已经添加了Qt3D相关模块:
    QT += core gui 3dcore 3drender 3dextras widgets
    
  • 包装后的QWidget会完全保留Qt3DWindow的交互逻辑(比如默认的鼠标旋转、缩放模型的相机控制),你之前针对view对象做的所有设置都依然有效
  • 如果需要自定义相机或添加额外交互,直接在原来的view对象上操作即可,容器只是做了一层包装,不影响底层的Qt3D逻辑

内容的提问来源于stack exchange,提问作者Saffist3r

火山引擎 最新活动