我是QT Quick和QML的新手,我正在尝试使用C ++和QT构建Linux桌面多屏幕应用程序。我已经看过QT提供的示例,但是大多数示例都是单个屏幕,并且没有说明如何具有多个屏幕,如何维护屏幕堆栈以及屏幕之间如何通信以及可用的方式是什么。
多屏幕QT Quick C ++应用程序示例将有所帮助。
这里有个例子:
main.cpp
main
函数的有趣部分:
QObject *QMLmainWindow = engine.rootObjects()[0];
QQuickWindow *QMLsecondWindow = qobject_cast<QQuickWindow*>(QMLmainWindow->findChild<QObject*>("secondWindow"));
QQmlComponent *qml = new QQmlComponent(&engine, QUrl(QStringLiteral("qrc:/ThirdWindow.qml")));
QQuickWindow *QMLthirdWindow = qobject_cast<QQuickWindow*>(qml->create());
QList<QScreen*> screens = app.screens();
if (screens.count() > 1) {
QRect secScreenGeometry = screens.at(1)->geometry();
QMLsecondWindow->setProperty("visible", true);
QMLsecondWindow->setX(secScreenGeometry.x());
QMLsecondWindow->setY(secScreenGeometry.y());
QMLsecondWindow->resize(secScreenGeometry.width(), secScreenGeometry.height());
QMLthirdWindow->setScreen(screens.at(1));
QMLthirdWindow->setProperty("visible", true);
}
return app.exec();
和带有Windows定义的QML文件:
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
SecondWindow {
id: secondWindow
objectName: "secondWindow"
}
}
SecondWindow.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: false
width: 640
height: 480
title: qsTr("Second Window")
}
ThirdWindow.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: false
width: 640
height: 480
title: qsTr("Third Window")
}
QQuickWindow具有继承的方法setScreen
,但此方法仅适用于顶级窗口。如您所见,QMLthirdWindow
被创建为独立窗口,并且允许使用setScreen
方法。
但是如果我们要移动QMLsecondWindow
,则需要“手动”执行。因此,我们需要读取适当屏幕的几何形状,并为放置在目标屏幕上的窗口设置窗口的X,Y参数。在上述示例的结果中,“主窗口”将显示在主屏幕(0)的中心,“第二窗口”将显示在第二屏幕(1)的最大尺寸,“第三窗口”将显示在第二屏幕的中心(1)。
由于有了Qt.application.screens,因此我将使用纯QML:
Item {
id: root
visible: true
Component.onCompleted: {
wnd.createObject(root, {wndIndex: 0});
wnd.createObject(root, {wndIndex: 1});
}
Component {
id: wnd
Window {
property int wndIndex: 0
visible: true
width: 640
height: 480
title: qsTr("Screen " + wndIndex)
screen: Qt.application.screens[wndIndex]
}
}
}
在这种情况下,我们唯一需要使用QQuickView
而不是QQmlApplicationEngine
:
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQuickView *view = new QQuickView;
view->setSource(QUrl("qrc:/main.qml"));
view->show();
return app.exec();
}