Qt Creator模块学习——信号与槽

Qt Creator模块总结——信号与槽

信号和槽是什么

整个过程我想通过举例子来证明,比如开灯,开关的按钮就 相当于信号发出的地址,按钮被按动就是信号触发的方式,
灯亮是结果。也就是通过某个按钮的触发来运行某个函数。

信号和槽的特点

1.信号和槽可以有参数但是没有返回值。
2.当信号与槽函数的参数数量相同时,它们参数类型要完全一致。
3.信号的参数表比槽的参数表数量多,但是,从信号的参数表第一个参数开始,能够与槽的参数表完全对应,信号中多出的参数,将被槽忽略。
4.一般的,函数指针不能作为参数传递;模板类对象不能作为参数传递;
但是使用qRegistMetaType函数,将模板类注册为元类型,则可以传递:

#include<QMetaType>

qRegistMetaType<QList<void*>>("QList<void*>)

connect函数

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函数来说他并不知道要接受哪个信号,因此我们在函数重载的基础上加入指针,也就是在这里用了函数指针。大家可以在网上搜着看一下,我自己讲不清楚,非常抱歉。

Lambda表达式

使用条件: config += c++11(pro文件中)
优点:配合信号非常方便
格式: connect(信号发出的地址,信号发出方式,
{
}
);
[ ]符号中间表示后续{}中的变量及如果没有[]中的变量,即使有定义在{}也不能调用一个个写比较麻烦因此有些符号表示一定的集合,如下:
“=” :表示把外部所有局部变量,类中所有成员以值传递方式进行
“this" : 表示把类中所有成员以值传递方式进行
”& “: 表示把外部所有局部变量以值传递方式进行

()符号中表示参数。

使用方式:

  b1.setParent(this);
    b1.setText("@_@");
    b1.move(100,100);
    connect(&b1,&QPushButton::released,
            [=](){
    
    
 b1.setText("^_^");
           }
);

猜你喜欢

转载自blog.csdn.net/m0_50210478/article/details/108126729