在學習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”退出應用。行星子窗口中顯示以及事件響應均正常!