QML 获取加载的 qml 窗口的 winId

Ste*_*TJS 3 window hwnd qml

我想获取 qml 窗口的 winId。我有以下文件。

主.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
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的 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();
}
Run Code Online (Sandbox Code Playgroud)

崩溃消息是:

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).
Run Code Online (Sandbox Code Playgroud)

怎么了?如何获取窗口的 winId?

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

Window {
    id: _component
    objectName: "myMainWindow"
    ...
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

fol*_*bis 5

好的,正如我在评论中注意到的,您总是必须检查findChild. 其次,findChildobjectName,而不是id像你错误地假设的那样。但在你的情况下,这只是一个建议。您的问题myMainWindow已经是根项目(即Window项目),m_rootObject这正是您所需要的。因此,您尝试在项目本身内搜索项目并有效地获得空值。要获得Window您只需要:

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

当然,这段代码是多余的,我只是想展示一下这个想法。