2017-11-03 27 views
0

タイルマップを表示するために、QtWidgetsデスクトップアプリケーション内にスタンドアロンQtの例「mapviewer」を埋め込むことに関する奇妙な問題があります。 スタンドアロンで動作します。地図を読み込む。 QQuickWidgetを推奨する方法でQWidgetに埋め込まれていますが、期待どおりに動作するものはありません。QWidget内にQQuickWidgetマップを埋め込むことができません

  • 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

答えて

0

QQuickWidgetあなたの場合には良いことではありません。 あなたのユーザーインターフェイスがQt Quickで、それを表示したい場合は、これは良い方法です。

しかしここでは、C++ QtウィジェットにQMLを埋め込みます。このシナリオでは、QDeclarativeViewは良いクラスです。

以下の文をドキュメントのリンクで探します。

QDeclarativeViewはQMLファイルを表示し、QMLとC++のQt オブジェクト間を接続するための便宜 として提供QGraphicsViewサブクラスです。

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の最新バージョンでは、 e QDeclarativeViewは推奨されておらず、推奨交換はQQuickViewです。

QWidgetQQuickViewを埋め込む:

使用createWindowContainerQQuickViewためのウィジェットを取得します。

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

QDeclarativeViewは廃止されました。私はQt 5.9.2を使用しています。このケースでは、QWidgetに基づいていないQQuickViewが推奨されているので、別のQWidgetに追加することはできません。 – user2366975

+0

QQuickViewの場合、私は答えを更新しました....答えの一番下を見てください。 – Naidu

関連する問題