2017-02-27 1 views
0

Ich möchte die winId eines qml Fensters bekommen. Ich habe folgende Dateien.QML bekomme die winId eines geladenen qml Fensters

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 
    } 
} 

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

Die Crash-Nachricht ist:

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). 

Was ist falsch? Wie kann ich die winId meines Fensters bekommen?

EDIT: wir können sehen, dass rect_area immer noch schlecht ist. In editierten main.qml:

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

enter image description here

+2

Sie sollten den von 'findChild' zurückgegebenen Wert überprüfen. In Ihrem Fall ist es wahrscheinlich null, da es kein Fenster mit dem Namen 'myMainWindow' gibt. Sie müssen 'objectName:" myMainWindow "' zum Fenster hinzufügen, um Zugriff darauf zu erhalten. – folibis

Antwort

0

Ok, wie ich in Kommentar bemerkt man immer Wert von findChild zurück überprüfen. Zweitens, findChild sieht von objectName, nicht von id wie Sie falsch angenommen. Aber in Ihrem Fall ist es nur eine Empfehlung. Ihr Problem, dass myMainWindow ist bereits Root-Artikel (dh Window Artikel), also m_rootObject ist, was Sie brauchen. Sie versuchen also, das Element im Element selbst zu suchen und erhalten null. Um die Window Sie brauchen nur:

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

Sicher, dieser Code zu groß ist, ich will nur die Idee zeigen.