В Qt все элементы графического интерфейса называются виджетами. Базовым классом для любого виджета является QWidget, от него наследуются кнопки, поля ввода, метки, контейнеры и даже окна
Любой виджет можно встроить в другой виджет, передав родителя в конструктор. Родитель же автоматически удаляет всех детей при своём разрушении
Все виджеты должны создаваться и использоваться исключительно в главном потоке приложения, вызов методов виджета из других потоков приведёт к неопределённому поведению и краху
Взаимодействовать с виджетами можно двумя основными способами:
clicked(), который соединяется со слотом-обработчикомkeyPressEvent, mousePressEvent и подобные или установить фильтр событий через installEventFilterПример виджета QLineEdit - однострочное поле ввода:
QLineEdit *edit = new QLineEdit(parent);
QObject::connect(edit, &QLineEdit::returnPressed, [edit]() {
qDebug() << "Введено:" << edit->text();
});
Любое окно имеет корневой виджет или корневой макет (layout):
Упрощённо все виджеты в окне образуют дерево:
QMainWindow или QWidget)Кастомные виджеты создают в основном для группировки элементов и переиспользования. Они наследуются от QWidget, а в конструкторе создаются дочерние виджеты, и сразу им передается this как родителя. Например:
class MyWidget : public QWidget {
public:
explicit MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
auto *layout = new QVBoxLayout(this);
layout->addWidget(new QLabel("Заголовок", this));
layout->addWidget(new QPushButton("Кнопка", this));
}
};
Для локализации используется функция tr() для перевода строк. С помощью утилит lupdate извлекаются строки, переводятся и загружаются через QTranslator
class MyWindow : public QWidget {
Q_OBJECT
public:
MyWindow() {
// будет переведено при загруженном переводе
QPushButton *button = new QPushButton(tr("Hello"), this);
}
};
Для этого Qt использует файлы локализации в формате XML (файлы .ts):
lupdate сканирует исходники и извлекает строки, обёрнутые в tr(), создавая .ts-файлыlrelease компилирует в компактные .qm файлы.qm-файлы добавляются в .qrc и загружаются из ресурсов так же, как с дискаCMake для управления переводами предоставляет команду qt_add_translations или ручную обработку
Пример сборки с автоматическим добавлением перевода:
find_package(Qt6 COMPONENTS Widgets LinguistTools REQUIRED)
qt_add_executable(my_app main.cpp)
qt_add_translations(my_app
TS_FILES myapp_de.ts myapp_fr.ts
QM_FILES_OUTPUT_VARIABLE qm_files
)
target_link_libraries(my_app PRIVATE Qt6::Widgets)
В коде загрузка перевода из встроенных ресурсов:
QTranslator *translator = new QTranslator(qApp);
if (translator->load(":/translations/myapp_de.qm"))
qApp->installTranslator(translator);