рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЧреАрддрд╛рддреНрдордХ рдкрд░рд┐рдЪрдп - 2017 рдореЗрдВ, рдореИрдВ рдзреНрдпрд╛рди рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░реАрдХреА рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд▓рдЧрд╛ред рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдереА, рдЕрдиреБрдХреВрд▓ рдФрд░ рдмрд╣реБрдд рдирд╣реАрдВред рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореБрдЭреЗ рдЖрдХрд░реНрд╖рдХ рд╕рдкрдиреЗ рджреЗрдЦрдиреЗ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдЙрдирдХреЗ рд╡рд┐рд╣рд┐рдд рд░реВрдк рдореЗрдВ рдзреНрдпрд╛рди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдЗрди рджрд┐рдиреЛрдВ, рдХрдИрдХрд╣рд╛рдирд┐рдпрд╛рдБ рдмрд╛рд░ рдкрд░ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВрд╢реМрдХ Google рдкрд░ рдЦреЛрдЬ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреАред рд▓рдЧрднрдЧ рддреБрд░рдВрдд, рд╢реАрд░реНрд╖-рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдзреНрдпрд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╛рдП рдЧрдП - рдХреИрд▓рдо рдФрд░ рд╣реЗрдбрд╕реНрдкреЗрд╕ред
рдкрд╣рд▓реЗ рдиреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ (рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ рд╢реИрдХреНрд╖рд┐рдХ рдзреНрдпрд╛рди) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛, рджреВрд╕рд░рд╛ рдореБрдЭреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрд╛, рдореБрдЭреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдИред рджреЛрдиреЛрдВ рдиреЗ рдЕрдкрдиреЗ рднреБрдЧрддрд╛рди рдХреЗ рд╕рд╛рде рджреВрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ (рдФрд░ рдореБрдЭреЗ рд░реВрд╕реА рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП) рдЯреИрд░рд┐рдл рдпреЛрдЬрдирд╛рдПрдВред рд╢рд╛рдпрдж рдореИрдВ рд╕рд┐рд░реНрдл рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ :) Google Play рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рджреЛ рдореБрдХреНрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЖрдпрд╛ рд╣реВрдВ рдЬреЛ рдЖрддреНрдорд╛ рдореЗрдВ рдореЗрд░реЗ рдХрд░реАрдм рд╣реИрдВред рдкрд╣рд▓рд╛ "рд▓реЗрдЯреНрд╕ рдореЗрдбрд┐рдЯреЗрдЯ" рд╣реИ - рдореИрдВ рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рджреВрд╕рд░реЗ рдкрд░ рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдЖрд╡реЗрджрди
рдЗрд╕рд▓рд┐рдП, рдХрд╛рдлреА рд▓рдВрдмреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЧреЛрдЪрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдЧрд░ рдореБрдЭреЗ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, "рдзреНрдпрд╛рдиред рдПрдВрдЯреЛрдиреЛрд╡ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ред" рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдореЗрдВ рдЪрд╛рд░ рд▓реЗрдЦрдХ рдХрд╛ рдзреНрдпрд╛рди рд╕реБрдирдирд╛ рд╕рдВрднрд╡ рдерд╛, рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд░рдЪрдирд╛ рдХреА рдЧрдИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛, рдЬрд┐рдирд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдорд┐рд▓реЗ рдФрд░ рдЙрдирд╕реЗ рджреЛрд╕реНрддреА рдХреАред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬреИрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╡реЗрдмрд╡реНрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╣реЛрдо-рдирд┐рд░реНрдорд┐рдд рдПрд╕рдкреАрдП, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирдВрдЧреЗ рдПрдЪрдЯреАрдПрдордПрд▓ рдФрд░ рдиреНрдпреВрдирддрдо рдЬрд╛рд╡рд╛ рдореЗрдВред рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛, рдФрд░ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдмрд╕ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдереЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕реЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдкрд╕рдВрдж рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреЛ рдЖрд╡реЗрджрди рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреА рдореБрдлреНрдд рдорджрдж рдХреА рдкреЗрд╢рдХрд╢ рдХреА, рддрд╛рдХрд┐, рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, "рдХреБрдЫ рд╡рд╛рдкрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП "рдХреЗ рдЖрдзрд╛рд░ рдкрд░" рдЙрдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реА рдорджрдж рдХреА, рдореИрдВ рдорджрдж рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╣рдореЗрдВ рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпрд╛ рдирд┐рд░реНрдгрдп рд╣реБрдП рдФрд░ рдЖрдЦрд┐рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реЗрд╕рд┐рдкреА рд╣реЛрдЧреА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА, рд▓реЗрдХрд┐рди рджрд┐рд▓рдЪрд╕реНрдк рджрд┐рд▓рдЪрд╕реНрдк :)
, :
Qt
тАФ (), PHP/HTML. , , , Qt, :
- Qt ( Symbian, MeeGo, Ubuntu Phone Android);
- , ;
- QML, C++. , тАФ JavaScript-like , ;
- iOS ( ).
UI
, , . , , . , . ( ):

"" anchors, Row, Column Repeater. , UI. , ( ):
Button {
id: mainButton
anchors {
left: parent.left
right: parent.right
}
height: btnLayout.height + 30
Material.background: "white"
onClicked: stackView.push(Qt.resolvedUrl("qrc:/qml/MeditationListPage.qml"))
Column {
id: btnLayout
spacing: 10
anchors {
top: parent.top
topMargin: 15
left: parent.left
right: parent.right
margins: 10
}
Row {
anchors.horizontalCenter: parent.horizontalCenter
spacing: (mainButton.width - 4 * 50) / 6
Repeater {
model: meditationModel
RoundedIcon {
source: Qt.resolvedUrl("qrc:/img/my%1.png".arg(model.index))
color: model.color
width: 50
height: 50
}
}
}
Label {
text: qsTr("")
font.pointSize: 14
color: "dimgrey"
anchors.horizontalCenter: parent.horizontalCenter
}
Label {
text: " , "
anchors {
left: parent.left
right: parent.right
}
horizontalAlignment: Text.AlignHCenter
Material.foreground: Material.Grey
font.pixelSize: 12
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
}
}
}
UI , HDPI Qt . , Qt: QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
. " ".
Material design, Android Qt Quick Controls 2 . https://doc.qt.io/qt-5/qtquickcontrols2-material.html. , Material design. UI , attached property Material.accent
.

mp3- , QRC. 10-15 . тАФ , 15 . , , pro-:
CONFIG += resources_big
, , , .
, " ". Shorts, , . DarkModeShader.qml
:
ShaderEffect {
fragmentShader: "
uniform lowp sampler2D source;
uniform lowp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
void main() {
lowp vec4 p = texture2D(source, qt_TexCoord0);
p.r = min(0.8, (1.0 - p.r) * 0.8 + 0.1);
p.g = min(0.8, (1.0 - p.g) * 0.8 + 0.1);
p.b = min(0.8, (1.0 - p.b) * 0.8 + 0.1);
gl_FragColor = vec4(vec3(dot(p.rgb, vec3(0.299, 0.587, 0.114))), p.a) * qt_Opacity;
}
"
}
:
StackView {
// ...
layer.effect: DarkModeShader { }
layer.enabled: optionsKeeper.isNightMode
}
.. , isNightMode
. Qt / ( , ).
, тАФ . - , тАФ !
Qt Multimedia, Audio
. mp3, , тАФ , :
Audio {
id: audioPlayback
source: meditAudioSource
}
// ...
Slider {
anchors {
left: parent.left
right: playBtn.left
verticalCenter: parent.verticalCenter
}
from: 0
to: audioPlayback.duration
value: audioPlayback.position
onMoved: audioPlayback.seek(value)
Material.accent: meditColor
}
Settings
Qt.labs.settings
(, , labs):
import Qt.labs.settings 1.0
// ... boilerplate- , .
property Settings settings: Settings {
property bool isNightMode: false
}
2018 , .
, , 2020, , - , тАФ ( ). , тАФ тАФ :)
, JSON- . . HTTP- QML- XMLHttpRequest
( JSON QML). .
. QML LocalStorage, SQLite. JS-, QML, :
// databasemodule.js
.pragma library // I hope this will prevent the waste of memory.
.import QtQuick.LocalStorage 2.0 as SQL
function getMeditations() {
...
}
// TransferManager.qml
import "databasemodule.js" as DB
...
var syncedItems = DB.getMeditations()
:
var db = SQL.LocalStorage.openDatabaseSync("AMeditation", "", "Main DB", 100000)
...
db.transaction(function(tx) {
dbResult = tx.executeSql("SELECT * FROM meditations")
console.log("meditations SELECTED: ", dbResult.rows.length)
})
.. , transaction
callback. ( , Qt ).
. openDatabaseSync
. , ( , ). . , , , . [" ", " ", " "]:
var migrations = [
{'from': "", 'to': "1.0", 'ops': function(transaction) {
transaction.executeSql("CREATE TABLE meditations ( \
id INTEGER PRIMARY KEY
...
status TEXT);")
}}
,{'from': "1.0", 'to': "1.1", 'ops': function(transaction) {
transaction.executeSql("ALTER TABLE meditations ADD quality TEXT;")
}}
]
, ( тАФ , - ).
C++
QML, C++. . Ubuntu Phone. . QML тАФ . C++- QML :
engine.rootContext()->setContextProperty("networkManager", new NetworkManager());
QML - :
// .
var isSucces = networkManager.download(downloadUrl, currentDownload.localUrl)
...
// .
Connections {
target: networkManager
onDownloadOperationProgress: {
d.currentDownload.current = current
d.currentDownload.total = total
}
...
}
C++-, QML- singletone :
class CppUtils : public QObject
{
Q_OBJECT
public:
explicit CppUtils(QObject *parent = nullptr);
~CppUtils();
Q_INVOKABLE bool removeFile(const QString& fileName) const;
static QObject *cppUtilsSingletoneProvider(QQmlEngine *engine, QJSEngine *scriptEngine);
};
qmlRegisterSingletonType<CppUtils>("AMeditation.CppUtils", 1, 0, "CppUtils", CppUtils::cppUtilsSingletoneProvider);
.. , cppUtilsSingletoneProvider
, Q_INVOKABLE тАФ "" QML. QML :
import AMeditation.CppUtils 1.0
// ...
CppUtils.removeFile(cd.localUrl)
, - . тАФ . , - , . , . QML (QNetworkAccessManager). . :
class CachingNetworkAccessManager : public QNetworkAccessManager
{
public:
CachingNetworkAccessManager(QObject *parent = 0);
protected:
QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0);
};
class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
{
public:
CachingNetworkManagerFactory();
QNetworkAccessManager *create(QObject *parent);
};
QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
{
QNetworkRequest req(request);
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
return QNetworkAccessManager::createRequest(op, req, outgoingData);
}
QNetworkAccessManager *CachingNetworkManagerFactory::create(QObject *parent) {
QNetworkAccessManager* manager = new CachingNetworkAccessManager(parent);
QNetworkDiskCache* cache = new QNetworkDiskCache(manager);
cache->setCacheDirectory(QString("%1/network").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
manager->setCache(cache);
return manager;
}
.. setCache
, createRequest
. тАФ , .
Android
SDK NDK. Linux- , Windows - (, , QtCreator 4.12 NDK, ). NDK Clang. arm_v7 (32 ), arm_v8a (64 ; Google play 2019 ). Google play.
, , .
- Qt pet-, Android. ;
- AMeditation ( UI " 2.1. ") 10+ 250 , ( , , ).
- , , !
- iOS .
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреНрдпреВрдЯреА рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдордЬреЗрджрд╛рд░ рд╣реИ, рдореБрдлреНрдд рдореЗрдВ рдФрд░ рдЖрддреНрдорд╛ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдХрд░рдирд╛!
рдкреАрдПрд╕ рдкреНрд░рд┐рдп рдЦрд╛рдмрд░реЛрд╡рд╕реНрдХ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЧрд┐рдиреЗрдВрдЧреЗ - рдЖрд╡реЗрджрди рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рдЧреИрд░-рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдЬреИрд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ред
PSS рдЖрд╡реЗрджрди рдореЗрдВ рдкреБрд░рд╛рдиреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЬреБрдбрд╝рд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг 1.1 рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 5k + рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ 100 рд╕рдореАрдХреНрд╖рд╛рдПрдБ рд╣реИрдВред рд╣рдо рд╢рд╛рдпрдж рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рд╕реНрдЯреЛрд░ рд╕реЗ рдирд┐рдХрд╛рд▓ рд▓реЗрдВрдЧреЗред