在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本:

一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(planets)。

在主函数调用过程中,这两个例子均使用QQuickView类来加载qml文件。

QQuickView嵌入到QT MDI中

将QMainWindow的中间窗口设置为多文档窗口区域:

 C++ Code 
1
2
3
4
 
QMdiArea* pCentralWidget = new QMdiArea;
setCentralWidget(pCentralWidget);
pCentralWidget->addSubWindow(pWidget);
pWidget->show();

其中关键是调用addSubWindow方法来不断增加子窗口,参数为QWidget指针。

QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widgetQt::WindowFlags windowFlags = ...)

经过测试发现,我使用QQuickWidget来替代QQuickView,planets-aml例子可以正常显示,但是planets例子却显示不出来,可能是该类不支持加载Three.js?

最后我将QQuickView包装成QWidget可以成功加载,做了一个MDI的例子:

在planets的副本上进行改造:

MainWindow.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMdiArea>
#include <QQuickView>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);

signals:

public slots:
    void newFile();

private:
    QMdiArea*       m_pCentralWidget;
    QQuickView*     newPlanet3D();
};

#endif // MAINWINDOW_H

MainWindow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
#include "MainWindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QCoreApplication>
#include <QtQml/QQmlEngine>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    m_pCentralWidget = new QMdiArea;
    setCentralWidget(m_pCentralWidget);
    QMenu *fileMenu = menuBar()->addMenu(QObject::tr("&File"));
    fileMenu->addAction(QObject::tr("N&ew"), this, SLOT(newFile()));
    fileMenu->addAction(QObject::tr("E&xit"), qApp, &QCoreApplication::quit);
}

void MainWindow::newFile()
{
    QWidget *container = QWidget::createWindowContainer(newPlanet3D());
    container->setMinimumSize();
    m_pCentralWidget->addSubWindow(container);
    container->show();
}

QQuickView* MainWindow::newPlanet3D()
{
    QQuickView* viewer = new QQuickView;
    // The following are needed to make examples run without having to install the module
    // in desktop environments.
#ifdef Q_OS_WIN
    QString extraImportPath(QStringLiteral("%1/../../../../%2"));
#else
    QString extraImportPath(QStringLiteral("%1/../../../%2"));
#endif
    viewer->engine()->addImportPath(extraImportPath.arg(QCoreApplication::applicationDirPath(),
                                                        QString::fromLatin1("qml")));
    viewer->setSource(QUrl("qrc:/planets.qml"));
    viewer->setTitle(QStringLiteral("Qt Canvas 3D Examples - Planets"));
    viewer->setResizeMode(QQuickView::SizeRootObjectToView);
    viewer->setColor(Qt::black);

return viewer;
}

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

MainWindow mainWindow;
    mainWindow.resize();
    mainWindow.show();

return app.exec();
}

编译运行,“File”->“New”新建行星子窗口,“File”->“Exit”退出应用。行星子窗口中显示以及事件响应均正常!

QT QQuickView嵌入到QT MDI中的更多相关文章

  1. 对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

    在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完. 2018.7.18更新: 正好在参加杭州UnrealCircle的时候见到 ...

  2. 将Unreal4打包后的工程嵌入到Qt或者桌面中

    #include "widget.h" #include "ui_widget.h" #include "windows.h" #inclu ...

  3. Qt实现嵌入桌面的半透明窗口 good

    这儿用上了前面一文提到的函数findDesktopIconWnd().见: http://mypyg.blog.51cto.com/820446/263349 一.将Qt窗口嵌入到桌面中.声明一个最简 ...

  4. qt cef嵌入web(二)

    在qt cef嵌入web文章中已经讲述了怎么把cef页面嵌入到qt程序中,但是这样并不完美,因为如果需要在多个窗口上创建cef浏览器部件的话,在 消息监听部分没有办法做区分多个浏览器事件,在这篇文章中 ...

  5. Qt Examples - Boxes (在Qt场景视图中结合OpenGL渲染)

    QT自带例程Boxes使用QT Graphics View框架实现了2D图形和3D图形的混合渲染,综合性比较强,整合知识较多,值得学习. 可以使用鼠标通过以下方式控制演示中的元素: 按住鼠标左键的同时 ...

  6. 【Qt开发】关于Qt应用程序中的堆栈、静态存储区的使用错误

    [Qt开发]关于Qt应用程序中的堆栈.静态存储区的使用错误 标签:[Qt开发] 最近终于又碰到了这个问题,想在main函数中定义一个局部大的数组,结果运行就报错,尼玛!刚开始真的不知道到发生了什么,后 ...

  7. PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性

    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...

  8. PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性

    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中部件的toolTip、toolTipDuration、statusTip、whatsThis属性

    toolTip属性 toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息.默认情况下,仅显示活动窗口子部件的toolTip,可以通过在 ...

随机推荐

  1. C#编程(八十一)---------- 捕获异常

    捕获异常 前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描述一下异常的捕获和处理. 案例代码: using System; using System.Coll ...

  2. Android 编程下 WebView 加载一个网页如何得到网页的 Cookie 值

    http://www.cnblogs.com/sunzn/archive/2013/04/03/2998113.html mWebView.setWebViewClient(new MyWebView ...

  3. 折叠代码块 C#中用 #region和#endregion java中用 //region和//endregion

    折叠代码块 C#中用 #region和#endregion   java中用 //region和//endregion

  4. 一篇文章让你学透Linux系统中的more命令

    Linux 下有很多实用工具可以让你在终端界面查看文本文件.其中一个就是 more. more 跟我之前另一篇文章里写到的工具 —— less 很相似.它们之间的主要不同点在于 more 只允许你向前 ...

  5. ImageProcessor.Web,再也不用自己生成缩略图了

    1.什么是ImageProcessor.Web ImageProcessor.Web是基于ImageProcessor的web图像处理模块,允许开发者使用URL查询字符串参数的方式作为指令执行图像处理 ...

  6. mysqld_safe 无法启动的原因

    [root@localhost ~]# 170408 09:53:13 mysqld_safe Logging to '/usr/local/mysql/data/localhost.localdom ...

  7. 利用 Express 托管静态文件

    通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片.CSS.JavaScript 文件等. 将静态资源文件所在的目录作为参数传递给 express.stati ...

  8. android 显示gif图片

    在android中不支持gif格式的图片,但是由于我希望在我的程序中刚刚加载的时候有一个小人在跑步表示正在加载.而这个小人跑就是一个gif图片.也就是希望程序一启动时就加载gif图片.在网上查找了一些 ...

  9. (转)PyCharm报错:“No R interpreter defined: Many R……”——解决办法

    报错截图: 下载安装链接:The Comprehensive R Archive Network

  10. [Big Data - Kafka] Kafka设计解析(三):Kafka High Availability (下)

    Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...