在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本:
一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(planets)。
在主函数调用过程中,这两个例子均使用QQuickView类来加载qml文件。
QQuickView嵌入到QT MDI中
将QMainWindow的中间窗口设置为多文档窗口区域:
1
2 3 4 |
QMdiArea* pCentralWidget = new QMdiArea;
setCentralWidget(pCentralWidget); pCentralWidget->addSubWindow(pWidget); pWidget->show(); |
其中关键是调用addSubWindow方法来不断增加子窗口,参数为QWidget指针。
QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = ...)
经过测试发现,我使用QQuickWidget来替代QQuickView,planets-aml例子可以正常显示,但是planets例子却显示不出来,可能是该类不支持加载Three.js?
最后我将QQuickView包装成QWidget可以成功加载,做了一个MDI的例子:
在planets的副本上进行改造:
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> class MainWindow : public QMainWindow signals: public slots: private: #endif // 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 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) void MainWindow::newFile() QQuickView* MainWindow::newPlanet3D() return viewer; |
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[]) MainWindow mainWindow; return app.exec(); |
编译运行,“File”->“New”新建行星子窗口,“File”->“Exit”退出应用。行星子窗口中显示以及事件响应均正常!