【问题标题】:QML get the winId of a loaded qml windowQML 获取加载的 qml 窗口的 winId
【发布时间】:2017-07-18 08:00:36
【问题描述】:

我想获得一个 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"
    ...
}

【问题讨论】:

  • 你应该检查findChild返回的值。在您的情况下,它可能为空,因为没有名称为 myMainWindow 的窗口。您必须将objectName: "myMainWindow" 添加到窗口才能访问它。

标签: window qml hwnd


【解决方案1】:

好的,正如我在评论中注意到的,您始终必须检查 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();
    }
}

当然,这段代码太过分了,我只是想表达一下思路。

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多