QT快速C++;具有多个屏幕的应用程序 我是QT Quy和QML的新手,我正在尝试用C++和Qt构建Linux桌面多屏幕应用程序。我已经看过QT提供的示例,但大多数示例都是单屏幕的,没有解释如何拥有多个屏幕,如何维护屏幕堆栈,以及屏幕如何相互通信以及可用的方法 一个多屏幕Qt快速C++应用程序的例子将有帮助。 < p>这里有一个例子:
main.cppQT快速C++;具有多个屏幕的应用程序 我是QT Quy和QML的新手,我正在尝试用C++和Qt构建Linux桌面多屏幕应用程序。我已经看过QT提供的示例,但大多数示例都是单屏幕的,没有解释如何拥有多个屏幕,如何维护屏幕堆栈,以及屏幕如何相互通信以及可用的方法 一个多屏幕Qt快速C++应用程序的例子将有帮助。 < p>这里有一个例子:,c++,qt,qml,qt-quick,C++,Qt,Qml,Qt Quick,main.cpp 主要功能的有趣部分: QObject *QMLmainWindow = engine.rootObjects()[0]; QQuickWindow *QMLsecondWindow = QMLmainWindow->findChild<QQuickWindow*>("secondWindow"); QQmlComponent *qml = new QQmlComponent(&engine, QUrl(QStringLiteral("qrc:/Thi
主要功能的有趣部分:
QObject *QMLmainWindow = engine.rootObjects()[0];
QQuickWindow *QMLsecondWindow = QMLmainWindow->findChild<QQuickWindow*>("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();
SecondWindow.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"
}
}
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: false
width: 640
height: 480
title: qsTr("Second Window")
}
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: false
width: 640
height: 480
title: qsTr("Third Window")
}
ThirdWindow.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"
}
}
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: false
width: 640
height: 480
title: qsTr("Second Window")
}
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: false
width: 640
height: 480
title: qsTr("Third Window")
}
QQuickWindow具有继承的方法setScreen
,但此方法仅适用于顶级窗口。如您所见,qmlhirdwindow
被创建为独立窗口,我们可以使用setScreen
方法
但是如果我们想移动QMLsecondWindow
,我们需要“手动”执行此操作。所以我们需要读取适当屏幕的几何图形,并为放置在目标屏幕上的窗口设置X、Y参数。在上述示例的结果中,“主窗口”将以主屏幕(0)为中心显示,“第二个窗口”将以最大尺寸显示在第二个屏幕(1)上,“第三个窗口”将以第二个屏幕(1)为中心显示。既然我们有,我将使用纯QML,例如:
Item {
id: root
visible: true
Component.onCompleted: {
for(var i = 0;i < Qt.application.screens.length;i ++)
{
wnd.createObject(root, {wndIndex: i});
}
}
Component {
id: wnd
Window {
property int wndIndex: 0
visible: true
width: 640
height: 480
title: qsTr("Screen " + wndIndex)
screen: Qt.application.screens[wndIndex]
}
}
}
谢谢你的回复和样品。但是我在考虑每个QML屏幕上的C++类,它将拥有QML屏幕的所有控制和通信。将有一些中心位置来维护屏幕堆栈,以暴露API,从而从屏幕堆栈中推送或弹出屏幕。这是如何实现的。是不是代码QObject*QMLmainWindow=engine.rootObjects()[0];QQuickWindow*QMLsecondWindow=qobject_cast(QMLmainWindow->findChild(“第二窗口”)代码>将进入一个名为ClassSecondWindow的单独类。还有什么是QList screens=app.screens()
正在做什么?好的,您在问题中没有提到关于屏幕管理器类的这个细节,所以我写了一个基本示例:)现在您可以了解它是如何进行的,这样您就可以将您需要的内容包装到一些核心屏幕管理类中。如果您以某种方式将类指针传递给引擎变量,您可以在任何地方“捕获”这样的qml窗口。QList screens是不使用app.screens()
的唯一快捷方式-您可以忽略此选项,并在任何需要访问屏幕列表的地方使用app.screens()
。当然,app
是QGUI应用程序对象,默认情况下在主函数开头的Qt Quick Application中创建。是的,我正在为多个屏幕/窗口寻找相同的示例。是否可以指向一些示例代码?恐怕我不知道此类示例。就我的目的而言,来自Qt的标准方法(如示例中所示)已经足够了,所以我现在无法提供更多帮助。但我相信你自己也能做到!祝你好运:)