Evgenii Legotckoi
Evgenii LegotckoiАқп. 19, 2018, 2:13 Т.Ж.

Android. Java vs Qt QML - Урок 001. Сәлем әлем

Қызықтыру үшін мен Android үшін қосымшаларды жазудың екі нұсқасын салыстыруды шештім. Бір кездері мен Java-де Android үшін бағдарламалауды бастадым, бірақ уақыт өте Qt QML жүйесінде жұмыс үстелі қосымшаларын әзірлеуге ауыстым. Бірақ енді мен Qt QML-ді көбірек ұнататыныма көз жеткізу үшін кейбір аспектілерді қайталауды шештім.

Мен бірден екі Сәлем әлемінің нәтижесін беремін. Олар, әрине, 100 пайыз бірдей болмайды, бірақ олар ұқсас болуы керек. Негізгі мысал ретінде мен Android Studio бағдарламасында жасалған бос әрекетті аламын.

Бірінші үлгі Java тіліндегі Hello World


Екінші үлгі - Qt QML-дегі Hello World

Жалпы, қолданбалар ұқсас, сыртқы түрі мәтінді көрсетуде және қосымша әсерлерде аздап ерекшеленеді. Барлық басқа аспектілерде қолданбалар бірдей.

Алдымен Java қолданбасынан бастайық.

Java жобасын жасаңыз

1-қадам - Жаңа жоба жасау үшін элементті таңдаңыз

2-қадам – жобаға атау беріңіз

3-қадам – минималды жоба SDK таңдау

4-қадам - Жоба түрін таңдау - Бос әрекет

5-қадам – Әрекетті орнату

Бұл жобаны жасайды және оны конфигурациялайды. Оны бірден жинап, смартфонда іске қосуға болады. Менде debug режимінде салынған apk өлшемі бар, мысалы 170 кБ болды.

Бағдарлама коды

Ал енді қосымшаның программалық коды қалай көрінетінін қарастырайық.

Java жүйесіндегі Android қолданбалары екі бағдарламалық қабаттан тұрады:

  1. Қолданбаның интерфейсі болып табылатын қосымшаның XML макетін, оның сыртқы түрі. Және іс жүзінде бағдарлама логикасы жоқ.
  2. Барлық бизнес логикасына жауап беретін Java қолданбасының логикасы және т.б. және т.б.

XML нұсқасы

Шынымды айтсам... элементтердің сипаттарын немесе мәтінін өзгерту үшін қандай да бір бағдарламалық логиканы пайдаланудың ешқандай жолы жоқ екеніне қарамастан, XML-де қолданбаның пайда болуының барлық қасиеттерін көрсету өте қиын болып көрінеді. Бұл күрделілік әсіресе күрделі интерфейстерді сипаттау қажет болғанда айқын болады.

Бірақ xml кодын көрейік.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.evileg.javahelloworld.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Мұнда сіз Hello World мәтіні бар өрістің өзі сипатталғанын көре аласыз, бірақ әрекетте бар Құралдар тақтасының сыртқы түрі сипатталмаған. Құралдар тақтасының болуы осы жағдайда пайдаланылатын әрекеттің мәтінмәні арқылы анықталады.

Бірақ QML-де, өкінішке орай, сол құралдар тақтасын өзіңіз жазуыңыз керек.

Java коды

Java кодының өзі кішкентай болады, себебі оған XML орналасуын орнату үшін Әрекет жасау әдісін қайта анықтау қажет. Біз AndroidManifest.xml ішінде қай әрекетті бастау керектігін анықтаймыз.

package com.evileg.javahelloworld;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Qt QML жобасын жасаңыз

1-қадам - бос Qt Quick қолданбасын жасауды таңдайық

2-қадам - Жоба орнын таңдау

3-қадам - Құрастыру жүйесін таңдаңыз

Сіз өзіңіздің талғамыңызға қарай таңдай аласыз:

  • qmake
  • cmake
  • qbs

Не таңдау керектігін білмеймін, qmake таңдаңыз

4-қадам - Qt Library нұсқасын таңдау

Ең соңғы тұрақты нұсқаны таңдаңыз (оны орнату керек)

5-қадам – Құрастыру жинағын таңдау

Qt туралы маған ұнайтыны QML қолданбаларының жұмыс үстелі және Android құрылғылары үшін де жасалуы мүмкін. Яғни, егер сіз платформаның функционалдығын сынамасаңыз, онда сіз жұмыс үстелі үшін қауіпсіз компиляция жасай аласыз және барлық тестілерді компьютеріңізде жүргізе аласыз және қолданбаның Android құрылғысында қалай жұмыс істейтінін мерзімді түрде тексере аласыз.

6-қадам – Көзді басқару жүйесін таңдау

Hello World үшін бізге нұсқаны басқару жүйесі қажет емес.

Бағдарлама коды

Qt QML жобалары әдетте Java-дағыдай екі бағдарламалық қабаттан тұрады.

  • С++ деңгейі – оған негізгі бизнес логикасын, күрделі есептеулерді, желіні құруды және т.б. жазуға болады.
  • QML деңгейі – ол қолданбаның сыртқы түрін, сонымен қатар кейбір логиканы жүзеге асырады, алайда қолданба мен мүмкіндіктер рұқсат етсе, QML-де барлық бизнес логикасын жүзеге асыруға ештеңе кедергі келтірмейді. QML сонымен қатар JavaScript-ті жақсы қолдайды, бұл логика оған сәйкес жүзеге асырылады.

Яғни, кейбір жағдайларда C++ қолданбауға ештеңе кедергі болмайды.

main.cpp

Бұл файл әдепкі бойынша жасалған. Бұл жағдайда QML қозғалтқышын іске қосамыз және main.qml файлының мазмұнын көрсетеміз.

#include <QGuiApplication>
#include <QQmlApplicationEngine>

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

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QMLHelloWorld.pro

Qt жоба файлы, ол барлық ресурстарды, сонымен қатар құрастыру параметрлері бар жобаның бастапқы файлдарын қамтиды. Ол AndroidManifest.xml файлынан басқа мұнда да қажет

QT += quick
CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += main.cpp

RESOURCES += qml.qrc \
    images.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
    android/AndroidManifest.xml \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradlew \
    android/res/values/libs.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew.bat

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

негізгі.qml

Міне, ең қызықтысы. Бұл файлда сізге HelloWorld мәтінін ғана емес, сонымен қатар белгішесі мен бағдарлама атауы бар құралдар тақтасын жасау керек. Мен Java жобасынан белгішені алып, Qt QML жобасының ресурстарына қостым.

import QtQuick 2.10
import QtQuick.Window 2.10
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.3
import QtQuick.Controls.Material 2.1

ApplicationWindow {
    visible: true
    width: 360
    height: 520
    title: qsTr("Hello World")

    header: ToolBar {
        height: 48

        Rectangle {
            anchors.fill: parent
            color: "#080808"

            Image {
                id: ico
                height: 36
                width: 36
                anchors {
                    left: parent.left
                    leftMargin: 10
                    top: parent.top
                    topMargin: 6
                }
                source: "qrc:/images/ic_launcher.png"
            }


            Text {
                anchors {
                    verticalCenter: parent.verticalCenter
                    left: ico.right
                    leftMargin: 4
                }

                text: qsTr("QmlHelloWorld")
                font.pixelSize: 18
                color: "white"
            }
        }
    }

    Label {
        anchors.centerIn: parent
        text: qsTr("Hello World!")
        font.pixelSize: 14
    }
}

Код Java қолданбасы үшін XML орналасу файлынан әлдеқайда көп болып шықты. Бірақ оны анықтап алайық. Бұл Qt QML-де бастапқыда әрекеттер болмағандықтан болды. Жалпы, бүкіл қолданбаның жұмысы бір әрекетте орын алады және бұл әрекеттер арасында ауысудың қажеті жоқ. Бағдарламаны Loader, StackView, SwipeView және басқа да көптеген құрамдастардың көмегімен әрекетті өзгерту сияқты әрекет етуге болады. Ал мұнда Құралдар тақтасын орналастыру орны бар терезе компоненті пайдаланылады, тек осы құралдар тақтасының макетін жазу керек.

Сонымен, егер мұндай құралдар тақтасы бастапқыда болған болса, онда Hello World мәтінін жазу Java-ға қарағанда қиынырақ болады. Яғни, болар еді

import QtQuick 2.10
import QtQuick.Window 2.10
import QtQuick.Controls 2.3
import QtQuick.Controls.Material 2.1

ApplicationWindow {
    visible: true
    width: 360
    height: 520

    Label {
        anchors.centerIn: parent
        text: qsTr("Hello World!")
        font.pixelSize: 14
    }
}

XML-де бұған қарсы

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.evileg.javahelloworld.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Шынымды айтсам, QML нұсқасы оқуға ыңғайлы болып көрінеді.

Жүйені және AndroidManifest.xml құрастырыңыз

Құрастыру жүйесі екі жағдайда да Gradle пайдаланылды.

AndroidManifest.xml-ге келетін болсақ, Java жағдайында ешқандай қосымша манипуляциялар жасалмаған. Qt жағдайында іске қосу белгішелерін қосу қажет болды. Qt ішінде AndroidManifest.xml бағдарламасымен жұмыс істеу туралы қосымша ақпаратты осы мақаладан оқи аласыз.

Қорытынды

Екі жағдайда да сіз екі бірдей қосымшаны ала аласыз, бірақ дамудың нюанстарында сіз не және кімге ыңғайлы болатынын шеше аласыз.

Екі нұсқа да екі қабатта жұмыс істеуді ұсынады

  • Java + XML
  • QML + C++

Бірақ QML/C++ жағдайында барлық логиканы тек QML тілінде жазуға болады, ал бірінші жағдайда тек макетті XML тілінде жазуға болады.

Алғашқы Hello World Java тілінде тез жазылады. Жобаны жасау жеткілікті болады және Qt QML бойынша ұқсас нәтижеге қол жеткізу үшін сізге сәл көбірек код жазу керек болады. Дегенмен, кейбір жағдайларда Java/XML-ге қарағанда QML-де әлдеқайда аз код жазуға тура келеді.

Qt кемшіліктерінің ішінде мен Java арқылы әлі де шешілуі керек платформаға тәуелді сәттер бар екенін бірден атап өткім келеді, мысалы, Android ОЖ оқиғалары. Дегенмен ... сонымен қатар жобаның кейбір проблемалық бөліктері Java жобасында C ++ арқылы шешіледі, сондықтан мұнда көбірек паритет болады.

Qt артықшылықтарының ішінде олардың соңғы нұсқаларында Material Design қолдайтынын атап өткім келеді, бұл сонымен қатар дизайнер болмаған кезде қосымшаның дамуын жеңілдетеді. жобада осындай.

Салынған APK өлшемі, Java бұл жерде әрине жеңеді. Отладка режимінде Java-дан шыққан APK бар болғаны 170 кБ шықты, ал Qt-тен APK 10 мб шықты, шығарылымда Qt APK өлшемі шамамен 5-6 мб болады, бірақ мен оны атамас едім. өте маңызды, өйткені Google Play-дегі көптеген үлкен қолданбалардың салмағы 40-60 МБ және нәтижесінде өлшемдері бірдей болады.

Басқа аспектілер келесі мақалаларда қарастырылады.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Разрешите узнать, как вы получили qt+qml приложение размером в 10мб(даже релизных). Дело в том, что пустое приложение, хоть и со стек вью, обходится мне на все 40мб пространства. Или же вы воспользовались ministro? Спасибо за ответ!

Добрый день. На тот момент ничего не использовал дополнительно и никаких специальных настроек не делал. Просто собрал и получилось 10 мб.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
m
moogoҚар. 22, 2024, 7:17 Т.Ж.
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Бізді әлеуметтік желілерде бақылаңыз