我想获得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"
...
}
答案 0 :(得分:2)
好的,正如我在评论中注意到的那样,你总是要检查findChild
返回的值。其次,findChild
按{1}}查看,而不是{错误地假设objectName
。
但在你的情况下,它只是一个建议。您id
已经是根项(即myMainWindow
项)的问题因此Window
就是您所需要的。因此,您尝试在项目内部搜索项目并有效地获取null。要获得m_rootObject
,您只需要:
Window
当然,这段代码太过分了,我只是想表明这个想法。