Qt学习笔记

信号与槽函数

解释

(1)信号和槽是用于QT对象之间的通信,信号可以有某种动作触发,也可以直接由代码触发。

(2)槽也叫操函数,当完成了信号和槽的连接之后,一旦触发信号,自动调用连接的槽函数。

(3)信号和槽的连接是动态的,对象释放后会自动断开所有的信号和槽。

(4)代码触发信号的写法

什么是信号和槽

信号和槽是用于对象之间的通信,它是Qt的核心机制,在Qt编程中有着广泛的应用。如果想学好Qt,一定要充分掌握信号的槽的概念与使用。

举个例子,在一个十字路口,信号灯变成了绿色,对面的汽车看到后就启动了。信号灯就是发送信号的对象,绿灯亮是它发送的信号 (signal),汽车是接收对象,汽车行驶是汽车对信号的响应,也叫槽 (slot)。

再举一个例子,比如在一个主窗口内有一个关闭按钮,如果点击这个按钮窗口就会关闭,那么关闭按钮是发送信号的对象,它发送的信号是点击,接收信号的对象是窗口,响应信号的槽是关闭窗口。

添加信号

关键字signals定义一个信号,信号不能也无需实现,并且返回值是void,信号与槽方法都可以携带参数,但是槽方法的参数类型必须是信号参数类型保持一致或者少于信号参数

signals:
    void Commeon(QString& str); //信号不能也无需实现,且返回值是void

发送信号

使用emit关键字发送信号 。我们可以在任何地方使用emit关键字发送信号,包括在槽方法内

void MainWindow::on_whBtn_clicked()
{
    QString str="武汉";
    emit Commeon(str);
}
 
void MainWindow::on_zgBtn_clicked()
{
    QString str="中国";
    emit Commeon(str);
}
 
void MainWindow::on_sjBtn_clicked()
{
    QString str="世界";
    emit Commeon(str);
}

信号与槽连接

QMetaObject::Connection QObject::connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接
 
)

常用格式:connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

信号使用SIGNAL,对于槽则使用SLOT,用它们将函数的原型包围起来即可。注意connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。

同时信号与槽连接方式:
Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。

也可以不使用SIGNAL和SLOT,直接信号和槽的地址。

connect(this,&MainWindow::Common,this,&MainWindow::CommonGuys);

信号可以看做是特殊的函数,需要带括号,可带参数,信号无需实现也不能实现。槽函数需要带括号,有参数时还需要指明参数。当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型。信号的参数需与槽的参数列表一致,允许比槽参数多。如果不匹配或参数过少,会出现编译错误或运行错误。在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

连接类型

一对一

声明两个信号signal1、signal2 和一个槽方法slot( ),将信号signal1与信号signal2相连,信号signal2与槽方法slot( )相连

signals:
    void signal1();
    void signal2();
private slots:
    void slot();

槽方法实现

void MainWindow::slot()
{
    qDebug()<<"我爱QT编程";
}

在构造函数中将信号与信号,信号与槽方法相连

 connect(this,SIGNAL(signal1()),this,SIGNAL(signal2()));
connect(this,SIGNAL(signal2()),this,SLOT(slot()));

一对多

声明一个信号和多个槽方法

 signals:
    void comeon(QString&str);
private slots:
    void comeon1();
    void comeon2();
    void comeon3();

槽方法实现

void MainWindow::comeon1()
{
    qDebug()<<"我爱编程";
}
 
void MainWindow::comeon2()
{
    qDebug()<<"我爱QT";
}
 
void MainWindow::comeon3()
{
    qDebug()<<"我爱QT编程";
}

在构造函数中将信号与槽方法连接

connect(this,SIGNAL(comeon(QString&)),this,SLOT(comeon1()));
connect(this,SIGNAL(comeon(QString&)),this,SLOT(comeon2()));
connect(this,SIGNAL(comeon(QString&)),this,SLOT(comeon3()));

信号与槽断开连接

QObject::disconnect(
    const QObject* sender,
    const char* signal,
    const QObject *receiver,
    const char* method
);

信号与槽机制的优越性

  1. 信号与槽机制是类型安全的,相关联的信号与槽参数必须匹配

  1. 信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。

  1. 信号与槽可以使用任意类型的任意数量的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值