文章目录
- 点击关闭窗口
- 自定义信号和槽
- 自定义信号和槽解决重载问题
- 信号和连接信号
- 断开连接
- Qt4版本信号槽连接
- Lambda表达式
点击关闭窗口
connect(信号发送者,发送的具体信号,信号接收者,型号的处理(槽slot));
这里自定义的
MyPushButton
与QPushButton
别无二至
Widget::Widget(QWidget *parent): QWidget(parent)
{resize(600,400);setWindowTitle("第一个窗口");setFixedSize(600,400);//创建一个按钮MyPushButton *myBtn = new MyPushButton;myBtn->setText("我自己的按钮");myBtn->setParent(this);myBtn->move(0,20);//需求: 点击我的按钮 关闭窗口connect(myBtn,&QPushButton::clicked, this,&Widget::close);
}
自定义信号和槽
//teacher.h
#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals://自定义信号写到signals下//返回值是void 只需要申明,不需要实现//可以有参数,可以重载void hungry();public slots:
};#endif // TEACHER_H
//student.h
#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots://早期Qt版本 必须要写到public slots,高级版本可以写到public或者全局下//返回值void,需要声明,也需要实现//可以有参数,可以发生重载void treat(); //申明
};#endif // STUDENT_H
#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::treat(){//实现qDebug() << "请老师吃饭";
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "teacher.h"
#include "student.h"namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;Teacher *zt;Student *stu;void classIsOver();
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->stu = new Student(this);//老师触发一个信号:饿了;学生响应信号:请客吃饭connect(zt,&Teacher::hungry,stu,&Student::treat);//调用下课函数classIsOver();
}void Widget::classIsOver(){//触发信号emit zt->hungry();
}Widget::~Widget()
{delete ui;
}
自定义信号和槽解决重载问题
//teacher.h
#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:void hungry();void hungry(QString foodName); //添加public slots:
};#endif // TEACHER_H
//student.h
#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots:void treat();void treat(QString foodName); //添加
};#endif // STUDENT_H
//student.cpp(实现)
#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::treat(){qDebug() << "请老师吃饭";
}void Student::treat(QString foodName){qDebug() << "请老师吃饭,老师要吃" << foodName;
}
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->stu = new Student(this);//连接带参数的信号和槽//指针 -> 地址//函数指针 -> 函数地址void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个connect(zt,teacherSignal,stu,studentSlot);//调用下课函数classIsOver();
}
void Widget::classIsOver(){//触发信号emit zt->hungry("红烧牛肉");
}Widget::~Widget()
{delete ui;
}
需要通过函数指针告诉它找哪块函数定义(有参还是无参)
这里不是有""
引起了要吃的东西(就是"红烧牛肉"
)
//Student.cpp
void Student::treat(QString foodName){qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
}
重点: 需要利用函数指针明确指向函数的地址
void(类名:: *实例名)(QString/*形参*/) = 类名::重载函数名
- QString转成
char *
- toUtf8()转为
QByteArray
;再使用data()
转为char *
- toUtf8()转为
信号和连接信号
点击一个按钮触发自定义连接
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->stu = new Student(this);//连接带参数的信号和槽//指针 -> 地址//函数指针 -> 函数地址void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个connect(zt,teacherSignal,stu,studentSlot);//重置窗口大小this->resize(600,400);QPushButton *btn = new QPushButton("下课",this);//connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);connect(btn,&QPushButton::clicked,zt,teacherSignal);}
依旧是信号在调用槽函数
断开连接
//void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个
//void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个
//connect(zt,teacherSignal,stu,studentSlot);
disconnect(zt,teacherSignal,stu,studentSlot);//与连接参数一致
Qt4版本信号槽连接
connect(zt,SUGHAL(hungry),st,SLOT(treat()));
Lambda表达式
C++11中的Lambda表达式用于定义并创建匿名函数对象。以简化编程工作
格式
[](){}();
- 空,没有使用任何函数对象参数。
=
,函数体内可以使用Lambda所在作用域范围内所有的局部变量(包括Lambda所在的this)并且是引用传递方式
(相当于编译器自动为我们按引用传递了所有的局部变量)&
,函数体内可以使用lambda
所在作用返回内所有可见局部变量(包括lambda所在类的this),并且是引用传递方式
(相当于编译器自动为我们按引用传递了所有局部变量)this
,函数体内可以使用lambda
所在类中的成员变量a
,将a按值进行传递,按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数时const的。要修改传递进来的a的拷贝,可以添加mutable
修饰符。&a
,将a按引用进行传递。a,&b
:将a按值进行传递,b按引用进行传递=,&a,&b
出a和b按引用进行传递外,其他参数按照值进行传递&,a,b
出a和b按值传递外,其他参数都按引用进行传递。