Qt для C++: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что это за библиотека и зачем нужна

Qt — это мощный кросс-платформенный фреймворк для разработки приложений на языке C++. Он позволяет создавать графические интерфейсы (GUI), консольные утилиты, сетевые приложения, мультимедийные программы и многое другое. Qt абстрагирует разработчика от специфики операционной системы, предоставляя единый API для Windows, macOS, Linux, Android и iOS.

Зачем нужен Qt?

  • Кросс-платформенность: Один код работает на разных ОС без изменений.
  • Богатая экосистема: Включает модули для работы с базами данных (Qt SQL), сетью (Qt Network), веб-движками (Qt WebEngine), мультимедиа (Qt Multimedia), 3D-графикой (Qt 3D) и т.д.
  • Производительность: Написан на C++, что обеспечивает высокую скорость выполнения.
  • Сигнально-слотовая система: Уникальный механизм для связывания объектов и обработки событий.
  • Готовые виджеты: Кнопки, таблицы, деревья, текстовые редакторы, диалоги и многое другое.
  • Инструменты разработки: Qt Creator — IDE с визуальным редактором форм.

Qt используется в таких проектах, как KDE (среда рабочего стола Linux), Telegram Desktop, VirtualBox, Autodesk Maya, VLC Media Player и многих других.

Установка

В отличие от интерпретируемых языков (Python, JavaScript), Qt для C++ не устанавливается через pip install или npm install. Это нативная библиотека, которая требует компиляции и настройки проекта.

Способ 1: Установка через официальный инсталлятор (рекомендуется)

  1. Перейдите на официальный сайт Qt.
  2. Скачайте Qt Online Installer для вашей ОС.
  3. Запустите установщик и войдите в аккаунт (или создайте бесплатный).
  4. Выберите версию Qt (например, Qt 6.5.3) и компоненты:
    • Qt (Desktop) — для настольных приложений.
    • Qt Creator — IDE.
    • Компиляторы (MinGW для Windows, GCC/Clang для Linux/macOS).
  5. Завершите установку.

Способ 2: Установка через пакетные менеджеры (Linux/macOS)

Ubuntu/Debian:

sudo apt update
sudo apt install qt6-base-dev qt6-tools-dev qtcreator

macOS (Homebrew):

brew install qt@6
brew install qt-creator

Windows (vcpkg):

vcpkg install qt6

Способ 3: CMake + FetchContent (для проектов)

Если вы используете CMake, можно автоматически скачать Qt:

include(FetchContent)
FetchContent_Declare(qt6
    GIT_REPOSITORY https://github.com/qt/qt6.git
    GIT_TAG v6.5.3)
FetchContent_MakeAvailable(qt6)

Быстрый старт с примером кода

Создадим простое окно с кнопкой, которая закрывает приложение.

Шаг 1: Создайте файл main.cpp

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QPushButton button("Закрыть приложение");
    button.resize(200, 100);
    button.show();

    // Соединяем сигнал clicked() кнопки со слотом quit() приложения
    QObject::connect(&button, &QPushButton::clicked, &app, &QApplication::quit);

    return app.exec();
}

Шаг 2: Создайте файл CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(MyFirstQtApp)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)

add_executable(MyFirstQtApp main.cpp)

target_link_libraries(MyFirstQtApp Qt6::Widgets)

Шаг 3: Соберите и запустите

mkdir build && cd build
cmake ..
make
./MyFirstQtApp

После запуска вы увидите окно с кнопкой. Нажатие на кнопку закроет приложение.

Основные методы/функции

1. QApplication::exec()

Что делает: Запускает главный цикл обработки событий приложения. Без этого вызова окно не будет отображаться и реагировать на действия пользователя.

Параметры: Нет.

Возвращает: int — код возврата приложения (обычно 0 при успешном завершении).

Пример:

QApplication app(argc, argv);
// ... создание виджетов ...
return app.exec();

2. QWidget::show()

Что делает: Делает виджет видимым. Если виджет был скрыт, он отображается на экране.

Параметры: Нет.

Пример:

QPushButton *btn = new QPushButton("Нажми меня");
btn->show(); // Отображаем кнопку

3. QWidget::resize(int w, int h)

Что делает: Устанавливает размер виджета в пикселях.

Параметры:

  • w — ширина.
  • h — высота.

Пример:

QMainWindow window;
window.resize(800, 600); // Устанавливаем размер главного окна

4. QObject::connect()

Что делает: Соединяет сигнал одного объекта со слотом другого объекта. Это основа событийной модели Qt.

Параметры:

  • sender — указатель на объект-отправитель.
  • signal — сигнал отправителя.
  • receiver — указатель на объект-получатель.
  • slot — слот получателя.

Пример:

QPushButton *btn = new QPushButton("Нажми");
QLineEdit *edit = new QLineEdit();

// При нажатии на кнопку текст из edit будет очищен
QObject::connect(btn, &QPushButton::clicked, edit, &QLineEdit::clear);

5. QLayout::addWidget(QWidget *widget)

Что делает: Добавляет виджет в компоновщик (layout). Компоновщики автоматически управляют расположением и размерами виджетов.

Параметры:

  • widget — указатель на добавляемый виджет.

Пример:

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(new QPushButton("Кнопка 1"));
layout->addWidget(new QPushButton("Кнопка 2"));

QWidget *window = new QWidget;
window->setLayout(layout);
window->show();

6. QString::arg()

Что делает: Заменяет плейсхолдеры %1, %2 и т.д. в строке на переданные значения. Аналог format() в Python.

Параметры:

  • a1, a2, ... — значения для подстановки.

Пример:

QString name = "Иван";
int age = 25;
QString message = QString("Привет, %1! Тебе %2 лет.").arg(name).arg(age);
// Результат: "Привет, Иван! Тебе 25 лет."

7. QFile::open(OpenMode mode)

Что делает: Открывает файл в указанном режиме.

Параметры:

  • mode — флаги режима (например, ReadOnly, WriteOnly, Append).

Возвращает: bool — true при успешном открытии.

Пример:

QFile file("data.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QTextStream in(&file);
    QString content = in.readAll();
    file.close();
}

8. QTextStream::operator<<()

Что делает: Записывает данные в поток (файл, строку, консоль).

Параметры: Данные для записи (строки, числа и т.д.).

Пример:

QFile file("output.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    QTextStream out(&file);
    out << "Hello, World!" << Qt::endl;
    out << "Число: " << 42;
    file.close();
}

9. QNetworkAccessManager::get()

Что делает: Выполняет HTTP GET-запрос. Возвращает объект QNetworkReply, который можно использовать для получения ответа.

Параметры:

  • request — объект QNetworkRequest с URL и заголовками.

Возвращает: QNetworkReply*.

Пример:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request(QUrl("https://api.example.com/data"));
QNetworkReply *reply = manager->get(request);

QObject::connect(reply, &QNetworkReply::finished, [reply]() {
    if (reply->error() == QNetworkReply::NoError) {
        QString data = reply->readAll();
        qDebug() << "Ответ:" << data;
    }
    reply->deleteLater();
});

10. QTimer::singleShot()

Что делает: Запускает однократный таймер, который срабатывает через заданный интервал.

Параметры:

  • msec — задержка в миллисекундах.
  • receiver — объект-получатель.
  • slot — слот для вызова.

Пример:

QTimer::singleShot(3000, this, [this]() {
    qDebug() << "Прошло 3 секунды!";
});

Реальный практический пример использования

Создадим простое приложение-заметки (NotePad) с возможностью сохранения и загрузки текста.

Файл main.cpp

#include <QApplication>
#include <QMainWindow>
#include <QTextEdit>
#include <QMenuBar>
#include <QMenu>
#include <                    

Рекомендаций