QSignalMapper类使用

本文介绍了如何使用QSignalMapper类来简化多个按钮点击信号的处理流程。通过示例代码展示了如何将不同按钮的clicked()信号映射到同一个槽函数中,并通过发送不同的字符串参数来区分触发信号的按钮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QSignalMapper类使用

如果我们想要将一组按钮的信号(比如说 clicked() 信号)与一个相同的槽函数相关联,可以有两种方法。
1.我们可以使用 connect 函数将每一个按钮的 clicked() 信号与这个槽函数关联。很明显,这样子很烦,不够聪明。
2.或者使用 QSignalMapper 类,如下所示:
buttonwidget.h 如下:

#ifndef BUTTONWIDGET_H
#define BUTTONWIDGET_H

#include <QWidget>
#include <QSignalMapper>

class ButtonWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ButtonWidget(const QStringList &texts, QWidget *parent = 0);

signals:

public slots:
    void clicked(const QString &text);

private:
    QSignalMapper *signalMapper;

};

#endif // BUTTONWIDGET_H

buttonwidget.cpp 如下:

#include "buttonwidget.h"
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>

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/5, i%5);
    }
    connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(clicked(QString)));
    setLayout(gridLayout);
    for(int i=0; i<texts.size(); ++i)
    {
        qDebug() << signalMapper->mapping(texts.at(i));
    }
}

void ButtonWidget::clicked(const QString &text)
{
    qDebug() << text;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值