我的项目需要在一个屏幕上显示两个QML Window
(一个发送方,一个接收方)。这两个.qml
都要求我在里面包括一些Cpp模型,因此,我使用QQmlApplicationEngine
来注册Cpp模型。
我发现,使用QWidget::createWindowContainer()
,我能够显示多个Window
s为一个项目。这对于第一个QML文件非常有效。代码片段如下所示:
QQmlApplicationEngine* engine = new QQmlApplicationEngine(Qurl("main.qml"));
QmlContext* context = engine.getContextProperty();
//do some Cpp models registering...
QQuickview *view = new QQuickview(engine,0);
QWidget* container = widget::createWindowContainer(view);
//I realized I dont need to do container->show(); for the main.qml to appear..
//use desktop widget to move the 2nd container to the 2nd screen...
我决定用类似的方法为我的receive.qml
创建第二个应用引擎。我很快意识到,即使有container2->show()
, receive.qml
也永远打不开。现在,它显示一个空页面。
我的问题是:
- 我的方法是正确的还是有更好的解决方案?
- 我需要注意什么信号才能赶上窗户关闭事件吗?我似乎无法检测到其中一个的信号窗户关着。因为我想在其中一个结束的时候关闭这两个检测到。
这可以做得更简单,例如:
main.qml
import QtQuick 2.3
import QtQuick.Window 2.2
Item {
Window {
objectName: "wnd1"
visible: true
}
Window {
objectName: "wnd2"
visible: true
}
}
所以你可以从c++代码访问这些窗口:
main.cpp
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QQuickWindow *wnd1 = engine.rootObjects()[0]->findChild<QQuickWindow *>("wnd1");
if(wnd1)
wnd1->setTitle("Server");
QQuickWindow *wnd2 = engine.rootObjects()[0]->findChild<QQuickWindow *>("wnd2");
if(wnd2)
wnd2->setTitle("Client");
要捕获关闭事件,您应该使用QQuickWindow::closing event