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/UDPQt SQL— работа с реляционными БД через единый APIQt 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 слоем.