Класс QSignalMapper
Класс QSignalMapper объединяет сигналы от идентифицируемых отправителей. Подробнее...
| Заголовок: | #include <QSignalMapper> |
| qmake: | QT += core |
| Наследует: | QObject |
Этот класс устарел. Он предоставляется для совместимости со старым исходным кодом. Мы настоятельно рекомендуем избегать его использования в новом коде.
Открытые функции
| QSignalMapper(QObject *parent = nullptr) | |
| virtual | ~QSignalMapper() |
| QObject * | mapping(int id) const |
| QObject * | mapping(const QString &id) const |
| QObject * | mapping(QWidget *widget) 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, QWidget *widget) |
| void | setMapping(QObject *sender, QObject *object) |
Открытые слоты
| void | map(QObject *sender) |
| void | map() |
Сигналы
| void | mapped(QObject *object) |
| void | mapped(QWidget *widget) |
| void | mapped(const QString &text) |
| void | mapped(int i) |
Подробное описание
Этот класс собирает набор сигналов без параметров и повторно излучает их с параметрами целого числа, строки или виджета, соответствующими объекту, отправившему сигнал.
Класс поддерживает сопоставление конкретных строк или целых чисел с конкретными объектами с помощью setMapping(). Сигналы объектов затем могут быть подключены к слоту map(), который излучит сигнал mapped() со строкой или целым числом, связанным с исходным объектом сигнализации. Сопоставления могут быть удалены позже с помощью removeMappings().
Пример: Предположим, что мы хотим создать пользовательский виджет, содержащий группу кнопок (например, палитру инструментов). Один из подходов — подключить сигнал каждой кнопки к своему собственному пользовательскому слоту; но в этом примере мы хотим подключить все кнопки к одному слоту и параметризовать этот слот кнопкой, которая была нажата.
Вот определение простого пользовательского виджета, имеющего один сигнал, clicked(), который излучается со значением текста нажатой кнопки:
class ButtonWidget : public QWidget
{
Q_OBJECT
public:
ButtonWidget(const QStringList &texts, QWidget *parent = 0);
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, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / 3, i % 3);
}
connect(signalMapper, SIGNAL(mapped(QString)),
this, SIGNAL(clicked(QString)));
setLayout(gridLayout);
} В конструктор передается список текстов. Создается сигнал-маппер, и для каждого текста в списке создается кнопка QPushButton. Мы подключаем сигнал clicked() каждой кнопки к слоту map() сигнал-маппера и создаем сопоставление в сигнал-маппере от каждой кнопки к тексту кнопки. Наконец, мы подключаем сигнал mapped() сигнал-маппера к сигналу 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, [=] { 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] void QSignalMapper::mapped(QObject *object)
Этот сигнал излучается, когда map() получает сигнал от объекта, для которого установлено сопоставление с объектом. Объект, полученный из сопоставления, передается в object.
Примечание: Сигнал mapped перегружен в этом классе. Для подключения к этому сигналу с помощью синтаксиса указателя на функцию Qt предоставляет удобную вспомогательную функцию, как показано в этом примере:
connect(signalMapper, QOverload<QObject *>::of(&QSignalMapper::mapped),
[=](QObject *object){ /* ... */ }); См. также setMapping().
[signal] void QSignalMapper::mapped(QWidget *widget)
Этот сигнал излучается, когда map() получает сигнал от объекта, для которого установлено сопоставление с виджетом. Сопоставленный виджет объекта передаётся в widget.
Примечание: Сигнал mapped перегружен в этом классе. Для подключения к этому сигналу с помощью синтаксиса указателя на функцию Qt предоставляет удобную вспомогательную функцию, как показано в этом примере:
connect(signalMapper, QOverload<QWidget *>::of(&QSignalMapper::mapped),
[=](QWidget *widget){ /* ... */ }); См. также setMapping().
[signal] void QSignalMapper::mapped(const QString &text)
Этот сигнал излучается, когда map() получает сигнал от объекта, для которого установлено сопоставление со строкой. Сопоставленная строка объекта передаётся в text.
Примечание: Сигнал mapped перегружен в этом классе. Для подключения к этому сигналу с помощью синтаксиса указателя на функцию Qt предоставляет удобную вспомогательную функцию, как показано в этом примере:
connect(signalMapper, QOverload<const QString &>::of(&QSignalMapper::mapped),
[=](const QString &text){ /* ... */ }); См. также setMapping().
[signal] void QSignalMapper::mapped(int i)
Этот сигнал излучается, когда map() получает сигнал от объекта, для которого установлено сопоставление с целым числом. Сопоставленное целое число объекта передаётся в i.
Примечание: Сигнал mapped перегружен в этом классе. Для подключения к этому сигналу с помощью синтаксиса указателя на функцию Qt предоставляет удобную вспомогательную функцию, как показано в этом примере:
connect(signalMapper, QOverload<int>::of(&QSignalMapper::mapped),
[=](int i){ /* ... */ }); См. также 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(QWidget *widget) const
Эта функция перегружает mapping().
Возвращает объект QObject-отправитель, связанный с widget.
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, был выпущен сигнал mapped(id).
Для каждого отправителя может быть не более одного целочисленного идентификатора.
См. также mapping().
void QSignalMapper::setMapping(QObject *sender, const QString &text)
Добавляет сопоставление, чтобы при подаче сигнала map() от sender, был выпущен сигнал mapped(text).
Для каждого отправителя может быть не более одного текстового значения.
void QSignalMapper::setMapping(QObject *sender, QWidget *widget)
Добавляет сопоставление, чтобы при подаче сигнала map() от sender, был выпущен сигнал mapped(widget).
Для каждого отправителя может быть не более одного виджета.
void QSignalMapper::setMapping(QObject *sender, QObject *object)
Добавляет сопоставление, чтобы при подаче сигнала map() от sender, был выпущен сигнал mapped(object).
Для каждого отправителя может быть не более одного объекта.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qsignalmapper.html