QtJuniorTechnical

Что такое Qt и какие платформы он поддерживает?

Qt — кроссплатформенный C++ фреймворк для разработки GUI и других приложений. Поддерживает Windows, macOS, Linux, Android, iOS, Embedded Linux, QNX и WebAssembly.

Что такое Qt

Qt (произносится «кьют») — кроссплатформенный фреймворк для разработки приложений с графическим интерфейсом, а также без него (embedded, серверные утилиты). Написан на C++, но имеет официальные биндинги для Python (PyQt / PySide), Rust, и других языков. Разрабатывается компанией The Qt Company, распространяется под лицензиями LGPLv3 / GPLv3 (бесплатно) и коммерческой лицензией.

Поддерживаемые платформы

  • Desktop: Windows (7 / 10 / 11), macOS (10.14+), Linux (X11, Wayland)
  • Mobile: Android (API 23+), iOS (12+)
  • Embedded: Qt for Device Creation — Yocto Linux, INTEGRITY, QNX, VxWorks, bare-metal через Qt для микроконтроллеров (Qt for MCUs)
  • WebAssembly: Qt 6.4+ поддерживает компиляцию в Wasm с Emscripten

Ключевые модули

  • Qt Core — базовые типы данных, файловая система, потоки, цикл событий
  • Qt Widgets — классические виджеты (QMainWindow, QDialog, QPushButton…)
  • Qt Quick / QML — декларативный UI с аппаратным ускорением (Scene Graph на OpenGL/Vulkan/Metal)
  • Qt Network — HTTP, WebSocket, TCP/UDP
  • Qt SQL — работа с реляционными БД через единый API
  • Qt Multimedia — видео, аудио, камера
  • Qt 3D — 3D-рендеринг и анимации
  • Qt WebEngine — встроенный Chromium (аналог WebView)

Минимальное приложение на Qt Widgets

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("Hello, Qt!");
    label.setWindowTitle("My First App");
    label.resize(300, 100);
    label.show();
    return app.exec();  // запуск цикла событий
}

Минимальное приложение на Qt Quick (QML)

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl("qrc:/main.qml"));
    return app.exec();
}
// main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true; width: 400; height: 200
    title: "Hello QML"
    Text {
        text: "Hello, Qt Quick!"
        anchors.centerIn: parent
        font.pixelSize: 28
    }
}

Система сборки

Qt поддерживает CMake (рекомендован с Qt 6) и собственный qmake (устарел). Установка через Qt Online Installer или системный пакетный менеджер:

# Ubuntu/Debian
sudo apt install qt6-base-dev qt6-declarative-dev cmake

# macOS (Homebrew)
brew install qt6

# Сборка проекта с CMake
cmake -B build -DCMAKE_PREFIX_PATH=$(brew --prefix qt6)
cmake --build build

Подводные камни

  • Путаница Qt 5 / Qt 6: API частично несовместимы; особенно изменились модули Multimedia, Quick Controls, шрифтовый рендеринг — проверяйте версию в документации.
  • Лицензирование: LGPL требует динамической линковки или предоставления исходников модифицированных частей Qt; статическая линковка без коммерческой лицензии затруднена.
  • Qt WebEngine: добавляет ~200 МБ к размеру приложения из-за встроенного Chromium — используйте только при необходимости.
  • Платформенные ограничения на мобильных: не все модули Desktop доступны на Android/iOS (например, Qt Serial Port на iOS недоступен).
  • WASM-ограничения: многопоточность в WebAssembly требует SharedArrayBuffer и специальных заголовков сервера (COOP/COEP).
  • Qt for MCUs: это отдельный продукт с ограниченным подмножеством QML — путать с Qt Quick нельзя.
  • moc и препроцессор: Meta-Object Compiler (moc) обрабатывает заголовки до компилятора; макросы условной компиляции внутри классов с Q_OBJECT могут вести себя неожиданно.

Common mistakes

  • Объяснять назначение Qt и платформы только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Смешивать signals/slots с generic callbacks и забывать про thread affinity.

What the interviewer is testing

  • Кандидат формулирует точную модель для назначение Qt и платформы, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.
  • Понимает границу между C++ кодом, runtime/framework metadata и editor/UI слоем.

Sources

Related topics