zoukankan      html  css  js  c++  java
  • 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”退出应用。行星子窗口中显示以及事件响应均正常!

  • 相关阅读:
    ShaderLab 枚举常量
    PHP to .NET Compiler
    填充圆算法
    战争迷雾
    A*
    寻路算法
    Unity中将动画片段保存为文件
    令人蛋疼的错误提示 0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab
    2D光照
    Rider 2018 激活码
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10578567.html
Copyright © 2011-2022 走看看