Класс QSignalMapper
Класс QSignalMapper объединяет сигналы от идентифицируемых отправителей. Подробнее...
| Заголовок: | #include <QSignalMapper> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследует: | QObject |
Открытые функции
| QSignalMapper(QObject *parent = nullptr) | |
| virtual | ~QSignalMapper() |
| QObject * | mapping(int id) const |
| QObject * | mapping(const QString &id) const |
| QObject * | mapping(QObject *object) const |
| void | removeMappings(QObject *sender) |
| void | setMapping(QObject *sender, int id) |
| void | setMapping(QObject *sender, const QString &text) |
| void | setMapping(QObject *sender, QObject *object) |
Открытые слоты
| void | map(QObject *sender) |
| void | map() |
Сигналы
| void | mappedInt(int i) |
| void | mappedObject(QObject *object) |
| void | mappedString(const QString &text) |
Подробное описание
Этот класс собирает набор сигналов без параметров и повторно отправляет их с параметрами целого числа, строки или виджета, соответствующими объекту, который отправил сигнал. Обратите внимание, что в большинстве случаев вы можете использовать лямбда-функции для передачи пользовательских параметров в слоты. Это менее затратно и упростит код.
Класс поддерживает сопоставление определённых строк, целых чисел, объектов и виджетов с определёнными объектами с помощью setMapping(). Сигналы объектов затем могут быть подключены к слоту map(), который отправит сигнал (он может быть mappedInt(), mappedString() и mappedObject()) со значением, связанным с исходным объектом, отправившим сигнал. Сопоставления можно удалить позже с помощью removeMappings().
Пример: Предположим, что мы хотим создать пользовательский виджет, содержащий группу кнопок (например, палитру инструментов). Один из подходов — подключить сигнал каждой кнопки к собственному пользовательскому слоту; но в этом примере мы хотим подключить все кнопки к одному слоту и параметризировать слот кнопкой, которая была нажата.
Вот определение простого пользовательского виджета, имеющего один сигнал, clicked(), который отправляется со строкой текста нажатой кнопки:
class ButtonWidget : public QWidget
{
Q_OBJECT
public:
ButtonWidget(const QStringList &texts, QWidget *parent = nullptr);
signals:
void clicked(const QString &text);
private:
QSignalMapper *signalMapper;
}; Единственная функция, которую нам нужно реализовать, — конструктор:
ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
: QWidget(parent)
{
signalMapper = new QSignalMapper(this);
QGridLayout *gridLayout = new QGridLayout;
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, &QPushButton::clicked, signalMapper, &QSignalMapper::map);
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / 3, i % 3);
}
connect(signalMapper, &QSignalMapper::mappedString,
this, &ButtonWidget::clicked);
setLayout(gridLayout);
} В конструктор передаётся список строк. Создаётся маппер сигналов, и для каждой строки в списке создаётся кнопка QPushButton. Мы подключаем сигнал каждой кнопки clicked() к слоту map() маппера сигналов и создаём сопоставление в маппере сигналов от каждой кнопки к тексту этой кнопки. Наконец, мы подключаем сигнал mappedString() маппера сигналов к сигналу clicked() пользовательского виджета. Когда пользователь нажимает кнопку, пользовательский виджет отправит одиночный clicked() сигнал, аргументом которого является текст нажатой кнопки.
Этот класс был в основном полезен до того, как лямбда-функции могли использоваться в качестве слотов. Приведённый выше пример можно переписать проще без QSignalMapper, подключившись к лямбда-функции.
ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
: QWidget(parent)
{
QGridLayout *gridLayout = new QGridLayout;
for (int i = 0; i < texts.size(); ++i) {
QString text = texts[i];
QPushButton *button = new QPushButton(text);
connect(button, &QPushButton::clicked, [this, text] { clicked(text); });
gridLayout->addWidget(button, i / 3, i % 3);
}
setLayout(gridLayout);
} См. также QObject, QButtonGroup и QActionGroup.
Документация по функциям-членам
QSignalMapper::QSignalMapper(QObject *parent = nullptr)
Конструирует QSignalMapper с родителем parent.
[slot] void QSignalMapper::map(QObject *sender)
Этот слот отправляет сигналы на основе объекта sender.
[slot] void QSignalMapper::map()
Этот слот отправляет сигналы на основе объекта, который отправляет ему сигналы.
[signal, since 5.15] void QSignalMapper::mappedInt(int i)
Этот сигнал отправляется, когда map() сигнализирует от объекта, для которого задано целое сопоставление. Переданное целое объекта сопоставления передаётся в i.
Эта функция была добавлена в Qt 5.15.
См. также setMapping().
[signal, since 5.15] void QSignalMapper::mappedObject(QObject *object)
Этот сигнал отправляется, когда map() сигнализирует от объекта, для которого задано сопоставление объекта. Объект, предоставляемый сопоставлением, передаётся в object.
Эта функция была добавлена в Qt 5.15.
См. также setMapping().
[signal, since 5.15] void QSignalMapper::mappedString(const QString &text)
Этот сигнал отправляется, когда map() сигнализирует от объекта, для которого задано строковое сопоставление. Строка объекта сопоставления передаётся в text.
Эта функция была добавлена в Qt 5.15.
См. также setMapping().
[virtual] QSignalMapper::~QSignalMapper()
Уничтожает QSignalMapper.
QObject *QSignalMapper::mapping(int id) const
Возвращает отправителя QObject, который связан с id.
См. также setMapping().
QObject *QSignalMapper::mapping(const QString &id) const
Эта функция перегружает mapping().
QObject *QSignalMapper::mapping(QObject *object) const
Эта функция перегружает mapping().
Возвращает отправителя QObject, который связан с объектом object.
void QSignalMapper::removeMappings(QObject *sender)
Удаляет все сопоставления для sender.
Это происходит автоматически при уничтожении сопоставленных объектов.
Примечание: Это не отключает сигналы. Если sender не уничтожается, то это нужно сделать явно, если это необходимо.
void QSignalMapper::setMapping(QObject *sender, int id)
Добавляет сопоставление, так что при сигнализации map() от заданного sender, отправляется сигнал mappedInt(id).
Для каждого отправителя может быть не более одного целочисленного идентификатора.
См. также mapping().
void QSignalMapper::setMapping(QObject *sender, const QString &text)
Добавляет сопоставление, так что при сигнализации map() от sender, отправляется сигнал mappedString(text).
Для каждого отправителя может быть не более одной строки.
void QSignalMapper::setMapping(QObject *sender, QObject *object)
Добавляет отображение, при котором, когда сигнал map() подаётся от отправителя, испускается сигнал mappedObject(объект).
Для каждого отправителя может быть не более одного объекта.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qsignalmapper.html