Сторінка «Про програму»

Відомості щодо вашої програми

Kirigami.AboutPage надає вам змогу показувати дані щодо авторських прав на програму, список учасників розробки та деякі відомості щодо того, на якій платформі запущено програму.

Спочатку, ми внесемо зміни до нашого файла main.cpp з попередніх частин підручника.

main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QUrl>
#include <KAboutData>
#include <KLocalizedContext>
#include <KLocalizedString>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);

    KLocalizedString::setApplicationDomain("helloworld");
    QCoreApplication::setOrganizationName(QStringLiteral("KDE"));
    QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
    QCoreApplication::setApplicationName(QStringLiteral("Hello World"));

    if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) {
        QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
    }

    KAboutData aboutData(
        QStringLiteral("helloworld"),
        i18nc("@title", "Hello World"),
        QStringLiteral("1.0"),
        i18n("Hello world application"),
        KAboutLicense::GPL,
        i18n("(c) 2021"));

    aboutData.addAuthor(
        i18nc("@info:credit", "Your name"),
        i18nc("@info:credit", "Author Role"),
        QStringLiteral("your@email.com"),
        QStringLiteral("https://yourwebsite.com"));

    // Set aboutData as information about the app
    KAboutData::setApplicationData(aboutData);

    // Register a singleton that will be accessible from QML.
    qmlRegisterSingletonType(
        "org.kde.example", // How the import statement should look like
        1, 0, // Major and minor versions of the import
        "About", // The name of the QML object
        [](QQmlEngine* engine, QJSEngine *) -> QJSValue {
            // Here we retrieve our aboutData and give it to the QML engine
            // to turn it into a QML type
            return engine->toScriptValue(KAboutData::applicationData());
        }
    );

    // Load an application from a QML file
    QQmlApplicationEngine engine;

    engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

У файлі «main.cpp» ми включаємо KAboutData , який є основним компонентом KDE Frameworks, який надає нам змогу зберігати відомості щодо програми, які згодом можна повторно використати у багатьох інших компонентах KDE Frameworks. Ми створюємо екземпляр нового об'єкта aboutData із його очевидно повним типовим конструктором та додаємо дані щодо авторства.

Після встановлення усіх потрібних відомостей ми викликаємо KAboutData::setApplicationData для ініціалізації властивостей об'єкта QApplication .

Потім ми створюємо qmlRegisterSingletonType() . Ця функція надає нам змогу імпортувати код C++ як модуль у нашому main.qml за допомогою інструкції import org.kde.example 1.0.

Першим аргументом є адреса, яку буде використано для імпортування, другим і третім аргументами є основна і проміжна версії, відповідно, четвертим аргументом є назва типу, назва, яку ми викликатимемо при доступі до методів нашого типу About. Останнім аргументом є посилання на об'єкт C++, доступ до якого буде відкрито для QML. В останньому випадку ми використовуємо лямбду для створення екземпляра aboutData нашої програми на місці.

main.qml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import QtQuick 2.15
import QtQuick.Controls 2.15 as Controls
import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami

import org.kde.example 1.0

Kirigami.ApplicationWindow {
    id: root

    title: i18nc("@title:window", "Day Kountdown")

    globalDrawer: Kirigami.GlobalDrawer {
        isMenu: true
        actions: [
            Kirigami.Action {
                text: i18n("Quit")
                icon.name: "gtk-quit"
                shortcut: StandardKey.Quit
                onTriggered: Qt.quit()
            },

            Kirigami.Action { // <==== Action to open About page
                text: i18n("About")
                icon.name: "help-about"
                onTriggered: pageStack.layers.push(aboutPage)
            }
        ]
    }

    Component { // <==== Component that instantiates the Kirigami.AboutPage
        id: aboutPage

        Kirigami.AboutPage {
            aboutData: About
        }
    }

    ListModel {
        id: kountdownModel
    }

    AddEditSheet {
        id: addEditSheet
        onAdded: kountdownModel.append({
            "name": name,
            "description": description,
            "date": Date.parse(kdate)
        });
        onEdited: kountdownModel.set(index, {
            "name": name,
            "description": description,
            "date": Date.parse(kdate)
        });
        onRemoved: kountdownModel.remove(index, 1)
    }

    function openPopulatedSheet(mode, index = -1, listName = "", listDesc = "", listDate = "") {
        addEditSheet.mode = mode
        addEditSheet.index = index;
        addEditSheet.name = listName
        addEditSheet.description = listDesc
        addEditSheet.kdate = listDate

        addEditSheet.open()
    }


    pageStack.initialPage: Kirigami.ScrollablePage {
        title: i18nc("@title", "Kountdown")

        actions.main: Kirigami.Action {
            id: addAction
            icon.name: "list-add"
            text: i18nc("@action:button", "Add kountdown")
            onTriggered: openPopulatedSheet("add")
        }

        Kirigami.CardsListView {
            id: layout
            model: kountdownModel
            delegate: KountdownDelegate {}
        }
    }
}

Спершу ми використовуємо імпортування, яке ми визначити у файлі main.cpp, а саме org.kde.example. Потім додаємо Kirigami.Action на нашу загальну висувну панель . Відповідна кнопка надаватиме нам змогу переходити на сторінку «Про програму». Створюємо на загальній панелі компонент з Kirigami.AboutPage на ньому, яка очікуватиме об'єкт KAboutData::applicationData() . Сторінка «Про програму» матиме лише одну властивість — aboutData. Ми відкрили саме це у нашому main.cpp і назвали його About, тому тут можемо це пропустити.

CMakeLists

У файлі CMakeLists.txt у найвищій теці проєкту додайте CoreAddons до виклику find_package(). Цей пакунок потрібен для KAboutData .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
add_executable(helloworld)

target_sources(helloworld PRIVATE
    main.cpp
    resources.qrc
)

target_link_libraries(helloworld
    Qt${QT_MAJOR_VERSION}::Quick
    Qt${QT_MAJOR_VERSION}::Qml
    Qt${QT_MAJOR_VERSION}::Gui
    Qt${QT_MAJOR_VERSION}::QuickControls2
    Qt${QT_MAJOR_VERSION}::Widgets
    KF${QT_MAJOR_VERSION}::Kirigami2
    KF${QT_MAJOR_VERSION}::I18n
    KF${QT_MAJOR_VERSION}::CoreAddons
)

У файлі CMakeLists.txt у каталозі src/ дописувати нічого не потрібно, оскільки ми створюємо екземпляр з aboutData на місці.

Запуск програми

Тепер, якщо ви запустите програму і скористаєтеся пунктом «About» на загальній висувній панелі, ви побачите нашу сторінку відомостей щодо програми.

Знімок сторінки «Про програму» Kirigami