Qt信号与槽——建立信号与槽
平常我们所见到的界面,鼠标点击一下指定的按钮,就会产生一定的效果。C++ Qt框架中的信号与槽机制是Qt进行对象间通信的一种方法,非常核心且有别于传统的回调函数或者消息传递机制。通过信号与槽,Qt能够在不同的对象之间安全地传递信息,而且这种机制是类型安全的。
信号 (Signals):信号是由对象发出的消息,告知程序发生了某个事件(如服务器托管网用户点击按钮)。信号仅有声明,没有定义,它们被定义在QObject或其任何子类中。当特定事件发生时,相应的信号就会被发射(emit)。例如,QPushButton类有一个clicked()信号,当用户点击按钮时,这个信号被发射。
槽 (Slots):”槽是用来响应信号的函数。当与信号相连的槽收到信号时,它就会被调用。和信号一样,槽也是QObject或其子类的成员。槽可以是普通的成员函数,也可以是lambda表达式或其他可调用的对象。
信号与槽的连接 (Connecting Signals and Slots):要使信号和槽一起工作,需要将它们连接起来。Qt提供了QObject::connect函数(静态函数)来实现这一点。当连接建立后,如果信号被发射,对应的槽就会被调用。
一、 简单界面
方法一 :演示新建一个QT项目。在ui设计界面,拖动一个button,下面有发送者、信号、接受者、槽,+ – 表示添加和删除。手动设置,如下的功能是点击窗口的按钮,窗口自动关闭。
方法二:了解即可。在下图的配置框中设置即可。
二、复杂事件设置信号与槽
方法一:自动连接(使用UI文件),通过命名约定自动连接信号与槽。
拖拽一个按钮,右键选择“转到槽”,选择相应的信号。
然后就可以在相应的函数进行操作。
运行点击按钮,生成结果。
void Widget::on_pushButton_clicked()
{
std::cout "方法一btnuiClicked" std::endl;
}
//on_pushButton_clicked()命名的槽会自动连接到相应的信号。
//原型是on_objectName_signalName
方法二:使用QObject::connect
拖拽一个按钮
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//方法二:在构造函数中进行信号与槽的绑定 这里信号是个宏
//QObject::connect(const QObject *sender, SIGNAL(signal()), const QObject *receiver, SLOT(slot())) 这里信号是个宏
QObject::connect(ui->btnCon,SIGNAL(clicked()),this,SLOT(no_btnCon_clicked()));
//no_btnCon_clicked() 自己命名,头文件中需要声明
}
//方法二
void Widget::no_btnCon_clicked()
{
std::cout "方法二btnConClicked" std::endl;
}
//头文件
private slots:
void on_btnUi_clicked();//方法一
void no_btnCon_clicked();//自己声明,方法二
方法三:使用c++11Lambda表达式
拖拽按钮
/* 方法三:lambda表达式:
QObject::connect(const QObject *sender, &Sender::signal,[=](){lambda body} )*/
//lambda匿名函数,不需要头文件声明
QObject::connect(ui->btnLambda,&服务器托管网QPushButton::clicked,[=](){
std::cout "方法三btnLambda" std::endl;
});
方法四:使用函数指针
直接连接信号与槽,可以利用ide的代码补全和检查错误。
/*方法四:函数指针
QObject::connect(const QObject *sender, &Sender::signal, receiver, &Recive::slot);
*/
QObject::connect(ui->btnPointer,&QPushButton::clicked,this,&Widget::on_btnPointer_clicked);
//头文件
private slots:
void on_btnUi_clicked();
void no_btnCon_clicked();
void on_btnPointer_clicked();
完整代码
头文件
#ifndef WIDGET_H
#define WIDGET_H
#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 on_btnUi_clicked();
void no_btnCon_clicked();
void on_btnPointer_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*方法二:在构造函数中进行信号与槽的绑定 这里信号是个宏
QObject::connect(const QObject *sender, SIGNAL(signal()), const QObject *receiver, SLOT(slot())) 这里信号是个宏
*/
QObject::connect(ui->btnCon,SIGNAL(clicked()),this,SLOT(no_btnCon_clicked()));
//no_btnCon_clicked() 自己命名,头文件中需要声明
//===============================
/* 方法三:lambda表达式:
QObject::connect(const QObject *sender, &Sender::signal,[=](){lambda body} )*/
//lambda匿名函数,不需要头文件声明
QObject::connect(ui->btnLambda,&QPushButton::clicked,[=](){
std::cout "方法三btnLambda" std::endl;
});
//===============================
/*方法四:函数指针
QObject::connect(const QObject *sender, &Sender::signal, receiver, &Recive::slot);
*/
QObject::connect(ui->btnPointer,&QPushButton::clicked,this,&Widget::on_btnPointer_clicked);
}
Widget::~Widget()
{
delete ui;
}
//方法一
void Widget::on_btnUi_clicked()
{
std::cout "方法一btnuiClicked" std::endl;
}
//方法二
void Widget::no_btnCon_clicked()
{
std::cout "方法二btnConClicked" std::endl;
}
//方法四
void Widget::on_btnPointer_clicked()
{
std::cout "方法四btnConClicked" std::endl;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
目录 一、Git简介 1.什么是Git 2.Git与SVN的区别 3.文件状态与工作区域 4.常用命令 二、gitee网站相关操作 1.创建仓库(公库和私库) 2.删除仓库 3.创建文件和文件夹 三、git本地配置账号和邮箱 四、实践操作 1.从gitee克隆…