在QWidget内部嵌入QQuickWidget地图无法正常工作

时间:2017-11-03 19:58:07

标签: qt qtquick2

我有一个奇怪的问题,就是为了显示平铺地图而在QtWidgets桌面应用程序中嵌入独立的Qt示例“mapviewer”。 独立它可以工作,例如加载地图。 使用QQuickWidget推荐的方式嵌入QWidget中,没有任何工作正常。

  • 当没有将QQuickWidget view_添加到布局时,会出现2个(!)顶级窗口小部件。
  • 如果我将view_添加到蓝色问号处的布局,则下图中最左边的小部件会按预期添加到布局中。但是空地图视图仍然是顶级小部件。
  • view_无法加载或显示任何内容。
  • view_的菜单无法打开。

以下是来源:

#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();
}

头:

#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

我不知道这里有多复杂。我对QtWidgets非常熟悉,但对qml很新,所以也许我缺少一些非常明显的东西。

enter image description here

1 个答案:

答案 0 :(得分:2)

QQuickWidget对你来说不是一件好事。 如果您的用户界面是Qt Quick并希望显示它,那么这是一个很好的选择。

但是在这里,您将QML嵌入到C ++ Qt小部件中。对于这种情况,QDeclarativeView是一个很好的类。

在文档链接中查找以下声明。

  

QDeclarativeView是一个方便的QGraphicsView子类   用于显示QML文件,以及QML和C ++ Qt之间的连接   对象。

http://doc.qt.io/qt-4.8/qdeclarativeview.html#details

尝试这样的事情:

QDeclarativeView *qmlView = new QDeclarativeView;
qmlView->setSource(QUrl::fromLocalFile("qrc:///mapviewer.qml"));

this->layout()->addWidget(qmlView);

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

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

QQuickView中嵌入QWidget

使用createWindowContainer获取QQuickView的小部件。

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