QSignalMapper使用入门

该类收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发射它们。注意,在大多数情况下,您可以使用lambda将自定义参数传递给插槽。这是较低的成本,并将简化代码。

类支持特定字符串、整数、对象和小部件与特定对象的映射。
QSignalMapper我们可以理解为转发器,此话怎讲呢?比如,按钮点击的响应槽,绑定到QSignalMapper上,QSignalMapper收到按钮的点击后,又通知到另外的控件上做处理。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QVBoxLayout>
#include <QSignalMapper>
#include <QLineEdit>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QSignalMapper *pMapper = new QSignalMapper(this);

    QString str = "Button1 Button2 Button3 Button4 Button5";
    QStringList strList = str.split(" ");

    QVBoxLayout *pLayout = new QVBoxLayout(this);
    int nRowCnt = 0;
    foreach(const auto& it, strList){
        QPushButton *pBtn = new QPushButton(this);
        pBtn->setText(it);

        connect(pBtn, SIGNAL(clicked()), pMapper, SLOT(map()));
        pMapper->setMapping(pBtn, pBtn->text()+"test");
        pLayout->addWidget(pBtn);
        pBtn->move(10,nRowCnt++*30);
    }

    QLineEdit *pEdit = new QLineEdit(this);
    pEdit->move(10,nRowCnt++*30);
    connect(pMapper, SIGNAL(mapped(QString)), pEdit, SLOT(setText(QString)));
    pLayout->addWidget(pEdit);
    pLayout->addStretch();
    setLayout(pLayout);
}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述
另外可以用:
(pushButton动态生成的话,可以放容器里,如QList<QPushButton*> lst;)

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(clicked()));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(clicked()));
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(clicked()));
    ui->pushButton->setWhatsThis("b1");
    ui->pushButton_2->setWhatsThis("b2");
    ui->pushButton_3->setWhatsThis("b3");
    ui->pushButton->setProperty("ttt","IamSoPoor");
    ui->pushButton_2->setProperty("ttt","11");
    ui->pushButton_3->setProperty("ttt","22");

	void MainWindow::clicked()
	{
	    auto obj = qobject_cast<QPushButton *>(sender());
	    qDebug()<<obj->text();
	    qDebug()<<obj->whatsThis();
	    qDebug()<<obj->property("ttt").toString();
	}
	void MainWindow::checkboxClicked(bool checked)
	{
		connect(ui->checkBox1, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked(bool)));
	    connect(ui->checkBox2, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked(bool)));
	    connect(ui->checkBox3, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked(bool)));
	    connect(ui->checkBox4, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked(bool)));
	    connect(ui->checkBox5, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked(bool)));
	    connect(ui->checkBox6, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked(bool)));
	    grp = new QButtonGroup(this);
	    grp->addButton(ui->checkBox1,0);
	    grp->addButton(ui->checkBox2,1);
	    grp->addButton(ui->checkBox3,2);
	    grp->addButton(ui->checkBox4,3);
	    grp->addButton(ui->checkBox5,4);
	    grp->addButton(ui->checkBox6,5);
	    auto checkBox = qobject_cast<QCheckBox*>(sender());
	    int id = grp->checkedId();
	    qDebug()<<"tt"<<checked<<checkBox->objectName()<<id;//checkBox1,whatisthis,property()
	    QString str = grp->checkedButton()->text();	
	}

参考:
https://blog.csdn.net/ly305750665/article/details/53790209

链接:https://pan.baidu.com/s/11BdAJX3dZqIghdWIsX0l5Q
提取码:l3a8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值