QT QQuickView嵌入到QT MDI中


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM