2017-11-03 8 views
0

바둑판 식으로 된 맵을 표시하기 위해 QtWidgets 데스크탑 앱에 독립형 Qt 예제 "mapviewer"를 포함시키는 것과 관련된 이상한 문제가 있습니다. 독립 실행 형, 예 : 지도를로드 중입니다. QQuickWidget을 사용하는 것이 권장되는 방법으로 QWidget 내부에 포함되어 있지만 예상대로 작동하지 않습니다.QWidget 안에 QQuickWidget 맵을 포함 시키면 작동하지 않습니다.

  • QQuickWidget view_을 레이아웃에 추가하지 않으면 2 개의 (!) 최상위 위젯이 나타납니다.
  • 파란색 물음표 대신에 view_을 레이아웃에 추가하면 아래 이미지의 가장 왼쪽 위젯이 예상대로 레이아웃에 추가됩니다. 하지만 여전히 빈지도보기는 최상위 위젯으로 유지됩니다.
  • view_에는 아무 것도로드되거나 표시되지 않습니다.
  • view_의 메뉴가 열리지 않습니다. 내가 그렇게 여기에 복잡 무엇인지 전혀 모른다

    #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 
    

    :

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

    헤더 : 여기

는 소스입니다. 저는 QtWidgets에 익숙하지만 qml에 익숙하지 않으므로 아마도 아주 명백한 것이 부족할 것입니다.

enter image description here

답변

0

QQuickWidget는 귀하의 경우 좋은 일이 아니다. 사용자 인터페이스가 Qt Quick이고 표시하고 싶다면이 기능이 좋습니다.

하지만 여기서는 C++ Qt 위젯에 QML을 포함시키고 있습니다. 이 시나리오의 경우 QDeclarativeView은 좋은 수업입니다.

문서 링크에서 아래 진술을 찾으십시오.

QDeclarativeView는 QML 파일을 표시하고, C++ 및 QML 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에서 th 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