2017-02-27 23 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'返回的值。你的情况可能是null,因为没有名为myMainWindow的窗口。您必须将'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(); 
    } 
} 

当然,这个代码是过度的,我只是想表明的想法。