Spec-Zone.ru › Qt 5.15

Класс 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 mappedInt(int i)
void mappedObject(QObject *object)
void mappedString(const QString &text)
void mappedWidget(QWidget *widget)

Подробное описание

Этот класс собирает набор сигналов без параметров и повторно излучает их с целочисленными, строковыми или параметрами виджетов, соответствующими объекту, который отправил сигнал. Обратите внимание, что в большинстве случаев вы можете использовать лямбда-функции для передачи пользовательских параметров в слоты. Это менее затратно и упростит код.

Класс поддерживает сопоставление определенных строк, целых чисел, объектов и виджетов с определенными объектами с помощью setMapping(). Сигналы объектов могут затем быть подключены к слоту map(), который будет излучать сигнал (он может быть mappedInt(), mappedString(), mappedWidget() и 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] void QSignalMapper::mappedInt(int i)

Этот сигнал излучается, когда map() сигнализируется объектом, для которого установлено целочисленное сопоставление. Целочисленное сопоставление объекта передаётся в i.

Эта функция была представлена в Qt 5.15.

См. также setMapping().

[signal] void QSignalMapper::mappedObject(QObject *object)

Этот сигнал излучается, когда map() сигнализируется объектом, для которого установлено сопоставление объекта. Объект, предоставленный сопоставлением, передаётся в object.

Эта функция была представлена в Qt 5.15.

См. также setMapping().

[signal] void QSignalMapper::mappedString(const QString &text)

Этот сигнал излучается, когда map() сигнализируется объектом, для которого установлено строковое сопоставление. Строковое сопоставление объекта передаётся в text.

Эта функция была представлена в Qt 5.15.

См. также setMapping().

[signal] void QSignalMapper::mappedWidget(QWidget *widget)

Этот сигнал излучается, когда map() сигнализируется объектом, для которого установлено сопоставление виджета. Объект сопоставленного виджета передаётся в widget.

Эта функция была представлена в 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(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, был испущен сигнал mappedInt(id).

Для каждого отправителя может быть только один целочисленный идентификатор.

См. также mapping().

void QSignalMapper::setMapping(QObject *sender, const QString &text)

Добавляет сопоставление, чтобы при поступлении сигнала map() от sender, был испущен сигнал mappedString(text).

Для каждого отправителя может быть только один текст.

void QSignalMapper::setMapping(QObject *sender, QWidget *widget)

Добавляет сопоставление, чтобы при поступлении сигнала map() от sender, был испущен сигнал mappedWidget(widget).

Для каждого отправителя может быть только один виджет.

void QSignalMapper::setMapping(QObject *sender, QObject *object)

Добавляет сопоставление, чтобы при поступлении сигнала map() от sender, был испущен сигнал mappedObject(object).

Для каждого отправителя может быть только один объект.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsignalmapper.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API