QML 获取加载的 qml 的 winId window

QML get the winId of a loaded qml window

我想获取一个qml的winId window。我有以下文件。

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

怎么了?如何获取 window 的 winId?

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

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

好的,正如我在评论中注意到的那样,您始终必须检查 findChild 返回的值。其次,findChild 通过 objectName 查找,而不是像您错误假设的那样通过 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();
    }
}

当然,这段代码太多了,我只是想表达一下想法。