具有多个屏幕的QT Quick C ++应用程序

问题描述 投票:0回答:2

我是QT Quick和QML的新手,我正在尝试使用C ++和QT构建Linux桌面多屏幕应用程序。我已经看过QT提供的示例,但是大多数示例都是单个屏幕,并且没有说明如何具有多个屏幕,如何维护屏幕堆栈以及屏幕之间如何通信以及可用的方式是什么。

多屏幕QT Quick C ++应用程序示例将有所帮助。

c++ qt qml qt-quick
2个回答
1
投票

这里有个例子:

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)。


0
投票

由于有了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();
}
© www.soinside.com 2019 - 2024. All rights reserved.