Building QT 6.2 for Android on Windows

First I built QT 6.2 for Windows then I installed JDK8, CMake 3.21.3 and configured QT as follows:

set "CMAKE_ROOT=E:\PFiles\cmake-3.21.3-windows-x86_64\bin"
set "NINJA_ROOT=E:\PFiles\ninja-win"
set "JDK_ROOT=C:\Program Files\Java\jdk1.8.0_301\bin"
set "MINGW_ROOT=E:\PFiles\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin"
set "PERL_ROOT=E:\PFiles\Strawberry\perl\bin"
set PATH=E:\PFiles\Python35;%PATH%
rem Check if the tools are in PATH
where gcc
where mingw32-make.exe
where perl.exe
where javac.exe
where python.exe
where cmake.exe
where ninja.exe

set "ANDROID_SDK_ROOT=C:\Users\D-Ef\AppData\Local\Android\Sdk"
set "ANDROID_NDK_PATH=C:\Users\D-Ef\AppData\Local\Android\Sdk\ndk\21.3.6528147"
rem See qtbase\mkspecs\android-clang\qmake.conf
set "ANDROID_NDK_PLATFORM=android-23"
rem see %ANDROID_SDK_ROOT%\build-tools folder
set MY_INSTALL_PATH=E:\Qt\Qt6.2\android
set QT_HOST_PATH=E:\Qt\Qt6.2\windows

configure.bat -platform android-clang -prefix %MY_INSTALL_PATH% -android-sdk %ANDROID_SDK_ROOT% -android-ndk %ANDROID_NDK_PATH% -qt-host-path %QT_HOST_PATH% -android-abis x86_64 ^
  -DQT_NO_EXCEPTIONS=1 -release -force-debug-info -opensource -confirm-license

How I fixed “CMake configuration has no path to C++ compiler” in QT Creator

CMake did not work and there was a yellow triangle at the left side of MSVC2019 kit name:

I fixed this buy changing C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat with C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsx86_arm64.bat.


Using QML_ELEMENT with CMake

There is an example of using QML_ELEMENT in qt5\qtdeclarative\examples\quick\scenegraph\openglunderqml and qt_add_qml_module in CMake:

    URI OpenGLUnderQML
    VERSION 1.0
    QML_FILES main.qml
    RESOURCE_PREFIX /scenegraph/openglunderqml

In QML it imports the module:

import OpenGLUnderQML 1.0

Building QT 6.2 for Windows with MSVC2019

I cloned QT repository:

git clone --recursive --branch v6.2.0
cd qt5

Looks like the command below is not required:

./init-repository --module-subset=all

because it prints:

Will not reinitialize already initialized repository (use -f to force)!

QtPurchasing uses deprecated AIDL billing library

Looks like QtPurchasing uses deprecated AIDL billing library and people say that it crashes on some devices. See for more information. Probably they are going to update it in 5.15.7 and move it into examples in QT 6, so it is not clear exactly what will happen with it, we probably better wait QT 5.15.7 to be released.


Adding a header to source files

Put the header content into a text file and load it into a variable:

cd ~/temp/
nano h.txt

Enabling colors in Window 10 console

Add DWORD key VirtualTerminalLevel=1 to HKEY_CURRENT_USER\Console:


Did you already learn what are C++ concepts?

In C++20 we can do this:

#include <ranges>
#include <vector>

template <std::ranges::range Range>
    requires std::same_as<std::ranges::range_value_t<Range>, int>
auto TransformIt(Range r)
    return r | std::views::transform([](int n) { return n * n; });

int main()
    std::vector<int> v;
    auto r = TransformIt(v);
    return 0;

std::unique_ptr with a deleter that throws an exception

The program below is terminated when the deleter throws the exception:

#include <iostream>
#include <memory>

struct X
    int value;

struct Deleter
    void operator()(X* p) noexcept(false)
        if (p->value == 0)
            throw std::logic_error("Can't delete a zero.");

        delete p;

Invokable constructor in QT

In QT 5.15 I declare a class with an invokable constructor:

class TestClass : public QObject


    Q_INVOKABLE TestClass() {}


register its type: