Часть 1. Введение Часть 2. Сервер Часть 3. Админский клиент Для генерации и отображения Qr-кодов будем использовать библиотеку qt-qrcode. Эта библиотека основана, как и большинство библиотек Qr-кодов, на основе libqrencode. Но проблема большинства библиотек в отвратном качестве кода. А вот эта либа вполне прилично выглядит.  Поддержка библиотеки прекратилась 8 лет назад, поэтому сделал я форк. Сейчас из изменений там есть фикс бага (если просто создать qr-код через конструктор, он будет невалиден, раньше приходилось заполнять его через сеттеры), и изменены pro/pri-файлы, чтобы можно было без лишних телодвижений подключить библиотеку в свой проект и как dll(so), и просто как исходные файлы. Само приложение будет выполнено в виде списка токен + expiration. Будут иметься функции создания нового токена, удаления старого, обновления всего списка и показа выбранного токена в виде Qr-кода. Для хранения списка токенов создадим ListModel. Модель будет сама ходить на заданный в конструкторе адрес, доставая, создавая или удаляя токены.    Для отображения напишем два класса: QrCodeWidget и QrCodeDialog. Первый будет просто рисовать Qr-код на себе, а второй — использовать первый для отображения qr-кода в диалоговом окне. Создание классов тривиально. Сам qr-код рисуется средствами класса QtQrCodePainter из библиотеки qt-qrcode. Этот класс может нарисовать qr-код на любом QPainterDevice, достаточно лишь запихнуть QPainterDevice в QPaint, и передать QtQrCodePainter.   Основное окно будет содержать 4 кнопки для обновления списка, удаления, добавления и отображения токенов. Определять, какой код удалить или отобразить можно за счёт модели выделения (QAbstractSelectionModel). Эта модель предоставляется классами отображения (и может быть заменена на любую другую), например, QListView.  Конструктор создаёт 4 кнопки, модель и представления, задаёт соединения (connect) для операций и раскидывает элементы по layout-ам. Иконки взяты с сайта https://icons8.com.  Обновление списка вызывается напрямую у модели при нажатии на кнопку, а остальным операциям нужно немного больше логики, поэтому для них создаются отдельные методы. Qr код отображается в диалоговом окне, развёрнутом на максимальный размер. Закрыть можно по крестику, или нажав Escape. При создании токена запрашивается время его жизни в секундах, а при удалении нужно лишь, чтобы был один выделенный токен.  Дефолтные окна для Windows — довольно шакальная вещь (поэтому мне нравятся такие дистрибутивы, как Manjaro Linux, на которых даже приложения без стилей выглядят вполне приятно).  Ну а на Windows мы можем в любой момент добавить набор qss-файлов. Для простоты воспользуемся инструментом qt_material. С его помощью можно сгенерировать qss-файлы с кучей настроек сразу под (ну вроде как) все виджеты.  Для этого делаем: Затем переходим в папку, куда хотим сгенерировать стили, открываем в ней консоль питона и вбиваем, например, такие настройки (подробнее на сайте проекта):  На выходе получаем файлы с ресурсами, которые нужно подключить к своему приложению (как будет выглядеть pro-файл, можно посмотреть на GitHub). Тут ещё стоит отметить, что файлы картинок (иконки и т.п), будут подключены как DISTFILES, но для распространения может быть удобно подключить их как RESOURCES. Теперь устанавливаем для приложения сгенерированный стиль:  И оно начинает выглядеть как-то так: В реальном проекте для генерации токена должны использоваться какие-то личные данные, чтобы в случае утечки токена было понятно, кому давать по шапке. Ну и, конечно, никакого отображения токенов в виде списка быть не должно, это сделано просто для простоты восприятия. Если дойдут руки, посмотрим, как можно сделать Android-приложения на Qt для сканирования такого токена и использования его в запросах.