我有一个奇怪的问题,就是为了显示平铺地图而在QtWidgets桌面应用程序中嵌入独立的Qt示例“mapviewer”。 独立它可以工作,例如加载地图。 使用QQuickWidget推荐的方式嵌入QWidget中,没有任何工作正常。
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很新,所以也许我缺少一些非常明显的东西。
答案 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);