Класс QSignalMapper
Класс QSignalMapper объединяет сигналы от идентифицируемых отправителей. Подробнее...
| Заголовок: | #include <QSignalMapper> |
| qmake: | QT += core |
| Наследует: | QObject |
Открытые функции
| QSignalMapper(QObject *parent = Q_NULLPTR) | |
| ~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) |
- 31 открытых функций, унаследованных от QObject
Открытые слоты
| void | map() |
| void | map(QObject *sender) |
- 1 открытый слот, унаследованный от QObject
Сигналы
| void | mapped(int i) |
| void | mapped(const QString &text) |
| void | mapped(QWidget *widget) |
| void | mapped(QObject *object) |
- 2 сигнала, унаследованные от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 11 статических открытых членов, унаследованных от QObject
- 9 защищённых функций, унаследованных от QObject
Подробное описание
Класс QSignalMapper объединяет сигналы от идентифицируемых отправителей.
Этот класс собирает набор сигналов без параметров и повторно излучает их с целыми числами, строками или параметрами виджетов, соответствующими объекту, который отправил сигнал.
Класс поддерживает сопоставление определённых строк или целых чисел с определёнными объектами с помощью 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() сигнал, аргументом которого является текст кнопки, которую пользователь нажал.
См. также QObject, QButtonGroup и QActionGroup.
Документация по функциям-членам
QSignalMapper::QSignalMapper(QObject *parent = Q_NULLPTR)
Конструирует QSignalMapper с родителем parent.
QSignalMapper::~QSignalMapper()
Удаляет QSignalMapper.
[slot] void QSignalMapper::map()
Этот слот излучает сигналы, основываясь на том, какой объект отправляет сигналы ему.
[slot] void QSignalMapper::map(QObject *sender)
Этот слот излучает сигналы, основываясь на объекте sender.
[signal] void QSignalMapper::mapped(int i)
Этот сигнал излучается, когда map() сигнализируется объектом, у которого установлено целое числовое сопоставление. Переданное целое число объекта передаётся в i.
Примечание: Сигнал mapped перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя на функцию, необходимо указать тип сигнала в статическом преобразовании, как показано в этом примере:
connect(signalMapper, static_cast<void(QSignalMapper::*)(int)>(&QSignalMapper::mapped),
[=](int i){ /* ... */ }); См. также setMapping().
[signal] void QSignalMapper::mapped(const QString &text)
Этот сигнал излучается, когда map() сигнализируется объектом, у которого установлено строковое сопоставление. Переданная строка объекта передаётся в text.
Примечание: Сигнал mapped перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя на функцию, необходимо указать тип сигнала в статическом преобразовании, как показано в этом примере:
connect(signalMapper, static_cast<void(QSignalMapper::*)(const QString &)>(&QSignalMapper::mapped),
[=](const QString &text){ /* ... */ }); См. также setMapping().
[signal] void QSignalMapper::mapped(QWidget *widget)
Этот сигнал излучается, когда map() сигнализируется объектом, у которого установлено сопоставление виджета. Переданный виджет объекта передаётся в widget.
Примечание: Сигнал mapped перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя на функцию, необходимо указать тип сигнала в статическом преобразовании, как показано в этом примере:
connect(signalMapper, static_cast<void(QSignalMapper::*)(QWidget *)>(&QSignalMapper::mapped),
[=](QWidget *widget){ /* ... */ }); См. также setMapping().
[signal] void QSignalMapper::mapped(QObject *object)
Этот сигнал излучается, когда map() сигнализируется объектом, у которого установлено сопоставление объекта. Объект, предоставленный маппером, передаётся в object.
Примечание: Сигнал mapped перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя на функцию, необходимо указать тип сигнала в статическом преобразовании, как показано в этом примере:
connect(signalMapper, static_cast<void(QSignalMapper::*)(QObject *)>(&QSignalMapper::mapped),
[=](QObject *object){ /* ... */ }); См. также setMapping().
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/archives/qt-5.6/qsignalmapper.html