1.什么是信号槽?
说到信号槽,大家肯定很陌生,没错,我第一次听到也很陌生,啥玩样儿?咱们先来看看英文吧!
好知道现在大家还是不懂,没事,慢慢来。
还记得咱们做的第一个ui界面吗?
当咱们点击注册按钮时,就会弹出这个信息框。
我先直接告诉你结论。
2.信号槽的机制
想要实现信号槽,我们必须要满足4个条件。
其次就是两个实现信号槽机制的前提。
来来来,说了那么多,咱们来小试牛刀。
咱们将文本输入信息和标签关联起来试试看…记得动手哦
首先拖一个Line Edit输入框,再加一个Label标签
在mainWindow.cpp中用 connect 关键字对两个不同的组件进行关联。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->lineEdit,//信号发送者的对象
SIGNAL(textChanged(const QString &)),//什么情况发生信号
ui->label,//信号接受者的对象
SLOT(setText(const QString &)));//接受到信号做什么(槽函数)
}
先展示效果:
当我在输入框输入信息时,label的信息会跟随我的输入而变化。
好的,现在来剖析一下代码
注意:
- SIGNAL和SLOT是将后面的函数转成字符串,以便在不同对象之间进行通信和连接!。
- 函数一定要带数据类型(形参可以省略)
- 组件的函数都是已经写好的,可以直接去找,等会会教。
3.信号槽的关联
要想玩信号槽机制,那么咱们必须先关联,刚刚咱们已经演示了一种关联方式,下面我来演示第二种关联方式
OK,言归正传
connect(ui->lineEdit,
&QLineEdit::textChanged,
ui->label,
&QLabel::setText);
注意:
- 函数不用参数
- 要有类名作用域可以到组件中去看
- 要取地址
- 因为没有参数,所以对多个同名函数不能用这种方式关联
4.自动关联
刚刚咱们上面讲的用connect的都是手动关联,其实咱们还可以自动关联,可以想想咱们第一个ui界面,没有用connect但是还是可以进行信号槽机制。
接下来咱们就来玩一玩自动关联,可以将刚刚的代码注释
然后我们写想要执行的效果,这里的qDebug相当于cout,在应用程序输出,需要头文件QDebug
void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
ui->label->setText(arg1);
qDebug()<<"哇哦,你真棒"<<endl;
}
运行结果:
这样咱们就没有写connect也自动进行了关联。所有的ui界面的组件都可以自动的进行关联。
假设我没有从ui设计里面用转到槽,自己定义一个,注意看我的函数命名。
然后在mainwindow.cpp中进行实现,发现新建的组件也可以进行修改,效果跟自动生成的一样。
这样看来,自动关联的就是靠函数命名这个机制去自动实现的。
值得注意的是,声明时private后面姚加一个slots
5.发送信号
新建一个按钮键,然后自动关联一下,转到槽。
void MainWindow::on_pushButton_clicked()
{
qDebug()<<"你点到我了"<<endl;
emit ui->lineEdit->textChanged("哈哈哈");
}