2017-02-27 1 views
0

qml 윈도우의 winId를 얻고 싶습니다. 다음 파일이 있습니다.QML로드 된 qml 윈도우의 winId를 얻으십시오.

main.qml :

import QtQuick 2.5 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 

Window { 
    id: myMainWindow 
    title: "MyMainWindow" 

    width: 200 
    height: 200; 
    visible: true 

    Component.onCompleted: { 
     x = 40 
     y = 40 
    } 
} 

내 MAIN.CPP :

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QWindow> 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    qmlRegisterType<FbItem>("fbitem", 1, 0, "FbItem"); 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    QObject* m_rootObject = engine.rootObjects().first(); 
    auto rect_area = m_rootObject->findChild<QWindow*>("myMainWindow"); //the id of the Window in qml 

    //both lines make the application crash 
    //HWND hWnd = reinterpret_cast<HWND>(rect_area->winId()); 
    WId wid = rect_area->winId(); 

    return app.exec(); 
} 

충돌 메시지는 다음과 같습니다

The inferior stopped because it triggered an exception. 
Stopped in thread 0 by: Exception at 0x13500da, code: 0x0000005: read access violation at: 0x0, flags=0x0 (first chance). 

잘못 무엇입니까? 내 창문을 어떻게 얻을 수 있습니까?

편집 : 우리는 rect_area가 여전히 나쁘다는 것을 알 수 있습니다. 편집 main.qml에서 : 나는 코멘트에 눈치

Window { 
    id: _component 
    objectName: "myMainWindow" 
    ... 
} 

enter image description here

+2

'findChild'에 의해 반환 된 값을 확인해야합니다. 귀하의 경우에는'myMainWindow'라는 이름의 창이 없으므로 아마 null 일 것입니다. 'objectName : "myMainWindow"'를 윈도우에 추가하면 윈도우에 액세스 할 수 있습니다. – folibis

답변

0

좋아, 당신은 항상 findChild에 의해 반환 된 값을 확인해야합니다. 둘째, findChildobjectName으로 표시되며, 잘못 가정하면 id으로 표시되지 않습니다. 하지만 귀하의 경우에는 단지 권장 사항입니다. myMainWindow이 이미 루트 항목 (예 : Window 항목)이므로 m_rootObject이 필요합니다. 따라서 항목 자체에서 항목을 검색하고 null을 유효하게 얻으려고합니다. 얻을 수있는 Window 만 필요,이 코드는 과도,

QObject* m_rootObject = engine.rootObjects().first(); 
if(m_rootObject) { 
    QWindow *window = qobject_cast<QWindow *>(m_rootObject); 
    if(window) { 
     WId wid = window->winId(); 
    } 
} 

는 물론 난 그냥 아이디어를 보여주고 싶어요.