QML获取加载的qml窗口的winId

时间:2017-02-27 16:02:13

标签: window qml hwnd

我想获得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).

有什么问题?我怎样才能获得窗口的winId?

编辑:我们可以看到rect_area仍然很糟糕。在编辑的main.qml中:

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

enter image description here

1 个答案:

答案 0 :(得分:2)

好的,正如我在评论中注意到的那样,你总是要检查findChild返回的值。其次,findChild按{1}}查看,而不是{错误地假设objectName。 但在你的情况下,它只是一个建议。您id已经是根项(即myMainWindow项)的问题因此Window就是您所需要的。因此,您尝试在项目内部搜索项目并有效地获取null。要获得m_rootObject,您只需要:

Window

当然,这段代码太过分了,我只是想表明这个想法。