QT Connect: Как связать компоненты программы
Qt Connect - это механизм, который используется для связывания (соединения) сигналов и слотов в приложении Qt. Сигналы и слоты - это ключевые компоненты взаимодействия в Qt, которые позволяют компонентам приложения взаимодействовать друг с другом без необходимости прямого вызова методов.
Сигналы и слоты могут быть определены в любом классе Qt, который наследуется от QObject. Сигналы объявляются в разделе signals блока Q_OBJECT макроса, а слоты - как обычные методы класса.
Пример объявления сигнала:
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent = nullptr);
signals:
void mySignal();
};
Здесь MyClass объявляет сигнал mySignal, который может быть вызван из других классов, подключившись к нему с помощью механизма Qt Connect.
Пример объявления слота:
class MyOtherClass : public QObject
{
Q_OBJECT
public:
MyOtherClass(QObject *parent = nullptr);
public slots:
void mySlot();
};
Здесь MyOtherClass объявляет слот mySlot, который может быть вызван в ответ на сигнал.
Чтобы связать сигнал и слот, используется функция QObject::connect. Синтаксис этой функции следующий:
connect(sender, signal, receiver, slot);
- sender - указатель на объект, который генерирует сигнал.
- signal - сигнал, который будет отсылаться объектом sender.
- receiver - указатель на объект, который будет получать сигнал.
- slot - слот, который будет вызываться при получении сигнала.
Пример связывания сигнала и слота:
QObject::connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
Здесь sender - объект класса Sender с сигналом valueChanged, а receiver - объект класса Receiver с соответствующим слотом updateValue.
Таким образом, при генерации сигнала valueChanged объектом sender, функция connect автоматически вызовет слот updateValue объекта receiver.
В заключение, пример кода, который связывает сигнал кнопки clicked с слотом QLabel::setText:
QPushButton *button = new QPushButton("Click me", this);
QLabel *label = new QLabel(this);
QObject::connect(button, &QPushButton::clicked, label, &QLabel::setText);
Здесь при нажатии кнопки "Click me" она генерирует сигнал clicked, который автоматически вызывает слот setText объекта label. Таким образом, текст метки label будет изменяться при каждом нажатии кнопки.