当前位置 博文首页 > ice_elephant的博客:Qt信号映射机制初步理解
Qt
关于信号映射的理解,信号映射是qt里面用来处理信号的一个方法,当多个相似的信号每一个都要用一个signal方法会觉得麻烦,这时我们会用到qt的信号映射机制。它的原理是利用一个相当于桥梁的东西将每一种命令要执行的槽函数连接起来,这就称为信号映射,接下来我们还是来看一个经典的信号映射的例子。
//我们看看预期效果有12按钮,按理说要用12个clicked方法还有槽方法才能处理,但是我们用了信号映射就只需要他原本响应的方法加上信号映射这个桥梁的方法了
这是我们的测试界面
我们点击2对应响应了对应的一个槽方法,
我们点击0对应响应了对应的一个槽方法,
头文件
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void DoClicked(const QString &str);
private:
Ui::Widget *ui;
QGridLayout *m_layout;
QPushButton *m_btn;
QSignalMapper *m_smapper;
QLineEdit *line;
};
#endif // WIDGET_H
widget.cpp
#include “widget.h”
#include “ui_widget.h”
#define QSTR QString::fromLocal8Bit
#include
#include
#include
//目标是
/*
**edit栏
1 2 3
4 5 6
7 8 9
. 0 C
*/
//1、用到信号映射
//2、用到按钮12个
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
line = new QLineEdit(this);
m_smapper = new QSignalMapper(this);
QString text;
m_layout = new QGridLayout;
m_btn = new QPushButton[12];
text = "1,2,3,4,5,6,7,8,9,.,0,C";
//采用QStringList 来初始化我们按钮上面的文本## 标题
QStringList store = text.split(",");//用split方法将以","为分隔符,分隔里面的字符
QLabel *label = new QLabel;
label->setText(QSTR("测试"));
//按钮布局,采用的是m_layout根据行列来初始化按钮布局
for (int i = 0; i < store.size(); i++) {
(m_btn + i)->setText(store.at(i));
m_layout->addWidget((m_btn + i), 1 + (i / 3), i % 3);//通过指针的方式找到每一个按钮
connect((m_btn + i), SIGNAL(clicked()), m_smapper, SLOT(map()));//这里是信号与槽,点击信号按钮发
//发射点击信号,到m_samapper相当于一个桥梁,SLOTmap(()),相应响应到下面的SLOT(mapped)方法
//mappper做信号,
m_smapper->setMapping(m_btn + i, store[i]);//给信号映射设置一个法则,既然是映射每个特定的 槽函数
//然需需要有特定的法则对应,这里我们采用的是btn+i,然后后面是以store[i]里内容作为区别点
//不同的btn上面按的有不同的字符,然后我们把这12个按钮都添加上去
}
m_layout->addWidget(label, 5, 0);
m_layout->addWidget(line, 0, 0, 1, 4);//设置标签布局,四个参数意思,在哪一行哪一列,跨越几行跨越几列
//为什么要用后面两个参数呢,因为我们第一行是编辑栏,而且我想要它一整行,所以加上后面的参数,
//4代表它跨越4列就是一整行了
connect(m_smapper, SIGNAL(mapped(const QString &)), this, SLOT(DoClicked(const QString &)));
//mapper做信号响应不同的槽方法,这样就避免了12个按钮用12个槽函数,这里用2个槽函数解决问题,
setLayout(m_layout);
}
Widget::~Widget()
{
delete[] m_btn;
delete ui;
}
void Widget::DoClicked(const QString &str)
{
QMessageBox::information(this, " Cliked", str + " isPushed");
}
main.cpp
#include “widget.h”
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.resize(450, 250);
w.show();
return a.exec();
}