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