整个过程我想通过举例子来证明,比如开灯,开关的按钮就 相当于信号发出的地址,按钮被按动就是信号触发的方式,
灯亮是结果。也就是通过某个按钮的触发来运行某个函数。
1.信号和槽可以有参数但是没有返回值。
2.当信号与槽函数的参数数量相同时,它们参数类型要完全一致。
3.信号的参数表比槽的参数表数量多,但是,从信号的参数表第一个参数开始,能够与槽的参数表完全对应,信号中多出的参数,将被槽忽略。
4.一般的,函数指针不能作为参数传递;模板类对象不能作为参数传递;
但是使用qRegistMetaType函数,将模板类注册为元类型,则可以传递:
#include
qRegistMetaType<QList<void*>>("QList<void*>)
connect函数是什么大家可以在百度搜索,我这里仅仅讲解用法。
connect(信号发出的地址即灯的开关所在地,信号发出方式即打开灯,接收者地址即灯的位置,信号处理函数即灯打开事件);`
例子:
p1.setText(" close");
p1.move(100,100);
connect(&p1,&QPushButton::pressed,this,&MainWindow::close);
例子中的p1在类的私有变量中声明。这是标准的信号与槽(pressed和close都是QT中有的)
我做了一个小程序来说明这一点,首先创建了两个窗口一个是子窗口一个是父窗口,然后每个窗口各有一个按钮。程序的开始只能看见父窗口,点击按钮父窗口消失子窗口出现,子窗口按钮被点击,子窗口消失,父窗口出现。其中的消失出现是我们自定义的槽函数实现的,而信号则是在子窗口发给父窗口时实现。
setWindowTitle("主窗口");
b1.setParent(this);
b1.setText("切换子窗口");
b1.move(100,100);
//点击按钮
connect(&b1,&QPushButton::released,this,&Widget::a);
//处理子窗口信号
connect(&w, &laoer::mysignal,this,&Widget::deal);
//主窗口按钮点击后槽函数
void Widget::a(){
w.show();
this->hide();
}
//用来处理子窗口发送的信号
void Widget::deal(){
w.hide();
this->show();
}
此处是声明自定义信号,信号必须有signals关键字声明
signals:
void mysignal();
此处为点击按钮后将信号的传输,传输给主窗口后主窗口开始处理。看代码一。这样写的目的仅仅是为了大家容易copy后看一下。
void laoer::sendslot(){
emit mysignal();
}
这里因为我自己学习的也不多,为了不丢人,我只能就我的理解大概说一下了。
在文章开始我就大概写了一下信号和槽的特点。因此这里我只用一个简单代码作为演示。
个人觉得带参数的槽函数是为了传值…
首先在子窗口加入信号(为了更方便的认知我采用了函数重载):
signals:
void mysignal();
void mysignal(int a,QString str);
随后我们通过发送该信号:
void laoer::sendslot(){
emit mysignal();
emit mysignal(5,"s");
}
connect(&b2,&QPushButton::clicked,this,&laoer::sendslot);
接收信号不太好理解先上代码然后做详细解释:
void (laoer::*funsignal)()= &laoer::mysignal;
connect(&w,funsignal,this,&Widget::dealle);
void (laoer::*textsignal)(int,QString)= &laoer::mysignal;
connect(&w,textsignal,this,&Widget::dealsignal);
此处因为两个信号名一样,对于connect函数来说他并不知道要接受哪个信号,因此我们在函数重载的基础上加入指针,也就是在这里用了函数指针。大家可以在网上搜着看一下,我自己讲不清楚,非常抱歉。
使用条件: config += c++11(pro文件中)
优点:配合信号非常方便
格式: connect(信号发出的地址,信号发出方式,
{
}
);
[ ]符号中间表示后续{}中的变量及如果没有[]中的变量,即使有定义在{}也不能调用一个个写比较麻烦因此有些符号表示一定的集合,如下:
“=” :表示把外部所有局部变量,类中所有成员以值传递方式进行
“this" : 表示把类中所有成员以值传递方式进行
”& “: 表示把外部所有局部变量以值传递方式进行
()符号中表示参数。
使用方式:
b1.setParent(this);
b1.setText("@_@");
b1.move(100,100);
connect(&b1,&QPushButton::released,
[=](){
b1.setText("^_^");
}
);