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




