2014-12-06 3 views
1

어떻게 QML ApplicationWindow 형식을 올바르게 확장 할 수 있습니까? 설명서에 따르면 ApplicationWindow는 QQuickWindow를 인스턴스화합니다. 그래서 QQuickWindow에서 서브 클래스를 작성하고 QML에 유형을 MyWindow로 노출했습니다. 문제는 MyWindow가 QML 유형 ApplicationWindow를 실제로 확장하지 않으므로 menuBar 및 toolBar와 같은 모든 속성을 얻지 못한다는 것입니다. 어떻게 ApplicationWindow를 C++로 확장하고 QML에 노출시킬 수 있습니까? 여기에 내가 현재하고 있어요 무엇 : 나는 다른 이유로 QQuickWindow에 C++에서 내 자신의 추가가 필요C++에서 QML ApplicationWindow 확장

import QtQuick 2.0 
import QtQuick.Controls 1.2 
import QtQuick.Layouts 1.1 
import MyExtensions 1.0 

MyApplicationWindow { 
    width: 800 
    height: 600 
    visible: true 

    menuBar: MenuBar { // ERROR: menuBar is not a property 
     Menu { 
      title: "File" 
      MenuItem { text: "New" } 
      MenuItem { text: "Open" } 
     } 
    } 
} 

참고 :

여기
class MyQuickWindow : public QQuickWindow 
{ 
    //...irrelevant additions 
} 


int main() 
{ 
    QGuiApplication app(argc, argv); 
    qmlRegisterType<MyQuickWindow>("MyExtensions", 1, 0, "MyApplicationWindow"); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); 

    return app.exec(); 
} 

는 QML 파일입니다.

답변

1

qmlRegisterType의 경우와 같이 보입니다. 그리고 C++ 파트로 무언가를 놓친다면 타입을 등록하는 것이 도움이 될 것입니다. 이는 형식 자체를 노출하기위한 것이며 파생 된 QQuickWindow 기능을 사용해야합니다 (실제로 ApplicationWindow에서 파생 됨). 그러나 당신이 무엇을 추가하는지에 대해서는 Q_PROPERTY과 Q_INVOKABLE (함수를위한 것입니다) 메카니즘을 다룰 필요가 있습니다. 전체 Q_ * QObject 매크로를 보라.

그리고 충분하지 않은 경우에는 inheritance의 예가 있습니다.

수정 : 저자는 QML 제작 유형을 다루고 있지만 그는 여전히 자신의 유형을 모방하려고 할 수 있습니다. ApplicationWindow.qml 소스 코드의 경로는 다음과 같습니다 : C : \ Qt \ 5.3 \ Src \ qtquickcontrols \ src \ controls 여기서 C : \ Qt \ 5.3 \은 선택된 Qt 버전의 루트입니다. 나는이를 시도 할 것입니다. 명시 적 QML 상속에 대해 알고 싶습니다. 이 파일은 Qt 소스 코드 repository에서 찾을 수 있습니다.

+0

그래, qmlRegisterType을 사용하여 사용자 지정 QQuickWindow 유형을 등록했습니다. 문제는 어떻게 QtQuick.Controls.ApplicationWindow와 함께 제공되는 기능을 추가 할 수 있는가입니다. –

+0

Firs off, 속성이 런타임에서 해석되는 한 QML에 노출 된 QtQuick.Controls.ApplicationWindow의 모든 기능을 상속해야합니다. 둘째, 새 기능을 추가하고 q_properties 등으로 노출 할 수 있습니다. – AlexanderVX

+1

하지만 문제는 C++에서 상속받을 ApplicationWindow 클래스가 없다는 것입니다. ApplicationWindow는 Window (QML)에서 파생 된 QML 유형으로, QQuickWindow (C++)를 인스턴스화합니다. MyQuickWindow (C++)는 QQuickWindow (C++)에서 상속 받았지만 지금은 ApplicationWindow (QML)와 관련된 것이 없습니다. Qt 예제 "확장 QML - 상속 및 강제 변환"에서 링크되는 사용자 유형은 확장 된 Person 유형입니다. 내가 알고있는 C++ 백본이없는 ApplicationWindow를 확장하려고합니다. –