Полноэкранное настольное приложение с QML

У меня есть опыт разработки богатого пользовательского интерфейса с flex и AS3. Однако проблема заключается в том, что очень сложно использовать существующую бизнес-логику С++ с этими гибкими приложениями. С появлением QML мне интересно, можно ли повторно использовать бизнес-логику С++ с QT для приложений с широким пользовательским интерфейсом.

Я хочу знать, можно ли разрабатывать полноэкранные приложения для пользовательского интерфейса (которые становятся все более распространенными, особенно в мобильных устройствах) для рабочего стола. Например (http://blog.flexexamples.com/2007/08/07/creating-full-screen-flex-applications/) Adobe имеет Flash Player, который можно использовать в полноэкранном режиме и запускает контент, написанный в AS3. Можно ли написать похожие приложения с помощью QT/QML?

Ответ 1

Если вы хотите использовать бизнес-логику, написанную на С++ и некоторый пользовательский интерфейс QML, вы можете использовать QDeclarativeView внутри своего приложения. Это просто обычный Qt-виджет, поэтому он имеет метод showFullScreen(). На самом деле этот класс похож на "qmlviewer внутри вашего приложения".

Итак, вы получите что-то вроде этого:

#include <QtGui/QApplication>
#include <QtDeclarative/QDeclarativeView>
#include <QtCore/QUrl>

int main(int _argc, char * _argv[])
{
    QApplication app(_argc, _argv);

    QDeclarativeView view;
    view.setSource(QUrl("qrc:/MyGui.qml"));    // if your QML files are inside 
                                               // application resources

    view.showFullScreen();    // here we show our view in fullscreen

    return app.exec();
}

Вы можете найти дополнительную информацию здесь.

Ответ 2

Существует также QML-единственный способ войти в полноэкранный режим. Вы можете использовать это, если вы не используете QDeclarativeView, но QQmlApplicationEngine, поскольку последний не наследует QWidget и не имеет метода showFullScreen().

import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
    id: window
    visible: true
    visibility: "FullScreen"
    width: 640
    height: 480

    Button {
        text: "exit fullscreen"
        onClicked: window.visibility = "Windowed"
    }
}

Но важно использовать ApplicationWindow как корневой элемент, а не Rectangle. Для ApplicationWindow вам нужно импортировать QtQuick.Controls.

Ответ 3

При использовании QQmlApplicationEngine в С++ вы можете сделать что-то подобное в QML:

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

main.qml

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
    id: mainWindow

    Component.onCompleted: {
        mainWindow.showFullScreen();
    }
}

Протестировано с QT5.8

Ответ 4

Qt имеет qmlviewer.

Чтобы запустить его в полноэкранном режиме:

$ qmlviewer -fullscreen -frameless file.qml

Также существует учебник по созданию полноэкранных приложений с QML. И components для виджетов рабочего стола.

Ответ 5

Вот еще одно отличие от предыдущих ответов, но в нем используется тип QML окна (по умолчанию Qt Quick Application - Empty) и перечисление Qt:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    id: mainWindow
    objectName: "mainWindow"
    visible: true
    flags: Qt.FramelessWindowHint | Qt.Window
    color: "black"
    visibility: Qt.WindowFullScreen // << the solution
}