itmo_conspects

Лекция 6. Виджеты и локализация в Qt

В Qt все элементы графического интерфейса называются виджетами. Базовым классом для любого виджета является QWidget, от него наследуются кнопки, поля ввода, метки, контейнеры и даже окна

Любой виджет можно встроить в другой виджет, передав родителя в конструктор. Родитель же автоматически удаляет всех детей при своём разрушении

Все виджеты должны создаваться и использоваться исключительно в главном потоке приложения, вызов методов виджета из других потоков приведёт к неопределённому поведению и краху

Взаимодействовать с виджетами можно двумя основными способами:

Пример виджета QLineEdit - однострочное поле ввода:

QLineEdit *edit = new QLineEdit(parent);
QObject::connect(edit, &QLineEdit::returnPressed, [edit]() {
    qDebug() << "Введено:" << edit->text();
});

Любое окно имеет корневой виджет или корневой макет (layout):

Упрощённо все виджеты в окне образуют дерево:

Кастомные виджеты создают в основном для группировки элементов и переиспользования. Они наследуются от 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):

CMake для управления переводами предоставляет команду qt_add_translations или ручную обработку