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(
600600);
    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(
1280800);
    mainWindow.show();

    
return app.exec();
}

编译运行,“File”->“New”新建行星子窗口,“File”->“Exit”退出应用。行星子窗口中显示以及事件响应均正常!

原文地址:https://www.cnblogs.com/MakeView660/p/10578567.html