在学习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 *widget, Qt::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(600, 600); 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(1280, 800); mainWindow.show(); return app.exec(); } |
编译运行,“File”->“New”新建行星子窗口,“File”->“Exit”退出应用。行星子窗口中显示以及事件响应均正常!