目录
信号与槽是QT 的核心机制!几乎所有的任务都是使用信号与槽去处理的!
1、信号的关联
信号与槽是QT 的核心机制!几乎所有的任务都是使用信号与槽去处理的!
一、信号与槽的关联
QT4语法:
connect(信号发送者,SIGNAL(信号),信号接收者(主窗口是this),SLOT(槽函数));
QT5语法:
connect(信号发送者,&发送者类名::信号名,信号接收者,&接收者类名::槽函数);
注意:槽函数和信号在哪定义的谁就是接收者或发送者。
二、关联流程
1、在构造函数中调用connect关联
//QT5:
关联按钮的信号与槽
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::button_fun);
2、在头文件声明槽函数
Q_OBJECT //对象
signals: 自定义信号,只需声明即可
void sig_f();
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
自定义槽函数,格式
public slots:
void button_fun();
3、槽函数实现
鼠标点击器,点击10次就不能点击
int i=0;
void MainWindow::button_fun(){
if(i==9)
ui->pushButton->setEnabled(false); 设置按钮为不可点击状态,ture为可点击状态,false为不可点击
// ui->pushButton->setDisabled(true); //这个也可以
ui->label->setNum(++i); 定义一个标签,显示数值
}
4、信号的发送
emit 信号名();
自定义发送一个信号
emit mysig(); 可以传参,信号发送在connect关联的时候就发送了
三、信号与槽的传递
信号与槽的参数可以在任意对象间传递
1.信号与槽的参数列表必须匹配。
2.信号的参数个数必须大于或等于槽函数的参数个数。//默认取第一个参数
四、信号与槽的互相关联
1、
2、信号与槽取消关联
在connect前面加dis前缀就行。 例如:
disconnect((ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()))
五、lambda与信号与槽
简化了槽函数,只需在lambda内部编写小代码就行
关联按钮的信号与槽,lambda格式
connect(ui->pushButton,&QPushButton::clicked,this,
[=](){
ui->label->setText("点击了按钮lambda ");
});
六、QButtonGroup 按钮组
1、signals信号
void buttonClicked(QAbstractButton *button) //直接传递按钮的地址
void buttonClicked(int id) //传递按钮的ID
2、函数接口
往按钮组中添加按钮
void addButton(QAbstractButton *button, int id = -1) //id为-1默认系统分配id
button:需要添加的按钮
id:给该按钮一个ID (编号)
对象管理树
this->dumpObjectTree(); 可以看到对象里面包含了哪些对象,QT是有内存回收机制的
关联对象按钮,buttonClicked()是内部函数!用于发送id信号。
connect(bg,SIGNAL(buttonClicked(int)),this,SLOT(Calculate(int))); //储存数字
总结:
1、信号与槽的关联通过connect函数关联。
2、QT4和QT5格式不一样,定义的槽函数不能切换,只能选一种格式。
3、QT里面处处是对象,层层递进,因此需要经常查手册。