Qt 在QWidget中嵌入QQuickWidget映射不起作用

Qt 在QWidget中嵌入QQuickWidget映射不起作用,qt,qtquick2,Qt,Qtquick2,为了显示平铺地图,我在QtWidgets桌面应用程序中嵌入独立的Qt示例“mapviewer”时遇到了一个奇怪的问题。 独立工作,例如加载地图。 在QWidget中嵌入了推荐的使用QQuickWidget的方法,但没有任何效果 当不将QQuickWidget视图添加到布局时,会出现2个(!)顶级小部件 如果我在蓝色问号处向布局添加视图,下图中最左边的小部件将按预期添加到布局中。但是空地图视图仍然是一个顶级小部件 视图根本不加载或显示任何内容 视图的菜单不打开 资料来源如下: #include

为了显示平铺地图,我在QtWidgets桌面应用程序中嵌入独立的Qt示例“mapviewer”时遇到了一个奇怪的问题。 独立工作,例如加载地图。 在QWidget中嵌入了推荐的使用QQuickWidget的方法,但没有任何效果

  • 当不将QQuickWidget
    视图
    添加到布局时,会出现2个(!)顶级小部件
  • 如果我在蓝色问号处向布局添加
    视图
    ,下图中最左边的小部件将按预期添加到布局中。但是空地图视图仍然是一个顶级小部件
  • 视图
    根本不加载或显示任何内容
  • 视图的菜单不打开
资料来源如下:

#include "mapwidget.h"    
#include <QtQuickWidgets/QQuickWidget>    
#include <QLabel>
#include <QVBoxLayout>    
#include <QQmlApplicationEngine>
MapWidget::MapWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setLayout(new QVBoxLayout);
    this->layout()->addWidget(new QLabel("label"));

    view_ = new QQuickWidget(nullptr);
    view_->setWindowTitle("QQuickWidget");
//    view_->engine()->addImportPath(QStringLiteral(":/imports"));
    QUrl url(QStringLiteral("qrc:///mapviewer.qml"));
    view_->setSource(url);

    // Show or embedd the widget, try it out
    view_->show();
    // this->layout()->addWidget(view_);

    QFile f(":/mapviewer.qml");
    if ( f.open( QIODevice::ReadOnly )){}
    Q_ASSERT(f.isOpen()); // OKAY so the qml file is found
    f.close();
}
#包括“mapwidget.h”
#包括
#包括
#包括
#包括
MapWidget::MapWidget(QWidget*父项)
:QWidget(父项)
{
此->设置布局(新的QVBoxLayout);
这个->布局()->addWidget(新的QLabel(“标签”);
视图=新的QQuickWidget(nullptr);
查看->设置窗口标题(“QQuickWidget”);
//查看->引擎()->addImportPath(QStringTerral(:/imports”);
QUrl url(QStringLiteral(“qrc:///mapviewer.qml"));
查看->设置源(url);
//显示或嵌入小部件,请尝试
查看->显示();
//此->布局()->添加小部件(视图);
QFile f(“:/mapviewer.qml”);
if(f.open(QIODevice::ReadOnly)){}
Q_ASSERT(f.isOpen());//好的,这样就可以找到qml文件了
f、 close();
}
标题:

#ifndef MAPWIDGET_H
#define MAPWIDGET_H

#include <QWidget>
class QQuickWidget;
class MapWidget : public QWidget
{
    Q_OBJECT
    QQuickWidget *view_ = nullptr;
public:
    explicit MapWidget(QWidget *parent = nullptr);
    ~MapWidget() = default;
};

#endif // MAPWIDGET_H
\ifndef MAPWIDGET\u H
#定义mapuh
#包括
类QQuickWidget;
类MapWidget:publicQWidget
{
Q_对象
QQuickWidget*视图=空PTR;
公众:
显式MapWidget(QWidget*parent=nullptr);
~MapWidget()=默认值;
};
#endif//MAPWIDGET_H
我不知道这里有什么这么复杂。我非常熟悉QtWidgets,但对qml来说是新手,所以我可能缺少一些非常明显的东西


在您的情况下,
QQuickWidget
不是一件好事。 如果您的用户界面是Qt Quick并且想要显示它,那么这是一个很好的例子

但这里,您将QML嵌入C++ QT小部件中。对于这个场景,

QDeclarativeView
是一个很好的类

在文档链接中查找以下语句

QDeclarativeView是一个QGraphicsView子类,是为方便起见而提供的 用于显示QML文件,以及QML与C++ Qt之间的连接 对象

试着这样做:

同样在上面的链接中,在突出显示的语句下面,您可以看到关于何时使用QML的良好描述以及在小部件中嵌入更多QML的缺点等等

在最新版本的Qt中,不推荐使用
QDeclarativeView
,建议更换为
QQuickView

QQuickView *qmlView = new QQuickView();
QWidget *container = QWidget::createWindowContainer(qmlView, this);
qmlView->setSource(QUrl("qrc:///mapviewer.qml"));
this->layout()->addWidget(qmlView);
QWidget
中嵌入
QQuickView

使用
createWindowContainer
获取
QQuickView
的小部件

QQuickView *qmlView = new QQuickView();
QWidget *container = QWidget::createWindowContainer(qmlView, this);
qmlView->setSource(QUrl("qrc:///mapviewer.qml"));
this->layout()->addWidget(qmlView);

但是QdeCrativeView不推荐使用,我使用的是Qt5.9.2。本例中建议的替代方案是QQuickView,它不基于QWidget,因此我无法将其添加到另一个QWidget。对于QQuickView,我已更新了答案。。。。请看答案的下半部分。