QT的学习记录3——QT的基础知识、信号与槽、lambda表达式的应用

1、多线程和线程同步

线程够用就好

此外在运行一次程序之后可以在存储文件的目录下找到类似于下方的文件:

双击打开之后再次打开:

下面这个就是运行程序后自动生成的exe:

快捷键的使用:

QT的坐标方向:

在生成的头文件中自定义信号时:

复制代码
signals:
复制代码
    void hungry();

对应在别的头文件中设置处理该信号的槽函数:

复制代码
public slots:
复制代码
    void treat();

在对应头文件的cpp文件中实现槽函数的具体用法

复制代码
void Student::treat(){
复制代码
    qDebug()<<"请老师吃饭";
复制代码
}

之后在widget的头文件中先包含用到的类并声明要用到的变量等

复制代码
private:
复制代码
    Teacher *zx;//声明默认指针
复制代码
    Student *lj;
复制代码
    void classisover();//下课函数

之后在对应的cpp文件中添加连接以及完善触发自定义信号函数等

复制代码
Widget::Widget(QWidget *parent)
复制代码
    : QWidget(parent)
复制代码
{
复制代码
    //创建一个学生对象
复制代码
    this->zx=new Teacher(this);
复制代码
    //创建一个老师对象
复制代码
    this->lj=new Student(this);
复制代码
    //老师饿了,学生请客
复制代码
    connect(zx,&Teacher::hungry,lj,&Student::treat);//发出什么信号和用什么槽函数处理信号都要取地址,不加括号,指针指向地址!!!
复制代码
    //调用下课函数
复制代码
    classisover();
复制代码
}
复制代码
void Widget::classisover(){
复制代码
 emit zx->hungry();  
复制代码
}

当没有发生重载时,上面这样的信号连接即可实现,但如果发生 重载,即函数的命名一致,只是带参有区别外,如下所示是重载现象:

此时使用上面的方法会出现错误,无法分辨是哪一个函数,此时需要进行更改,添加作用域

void(作用域::*名字)(参数)=函数地址

复制代码
   //出现重载时,函数指针->函数地址
复制代码
    void(Teacher::*teacherslot)(QString)=&Teacher::hungry;
复制代码
    void(Student::*studentslot)(QString)=&Student::treat;
复制代码
    connect(zx,teacherslot,lj,studentslot);//发出什么信号和用什么槽函数处理信号都要取地址,不加括号

之后即可分清调用的是那个信号和槽函数

复制代码
之后创建按钮点击触发下课,记得在cpp文件的开头添加库:#include<QPushButton>
复制代码
    QPushButton *btn=new QPushButton("下课",this);
复制代码
    this->resize(600,400);//重置按钮大小
复制代码
    connect(btn,&QPushButton::clicked,this,&Widget::classisover);

实现点击就出现一行:

此外除了信号与槽函数连接之外,信号与信号之间也可以进行连接:

通过点击按钮触发老师信号,老师信号和学生请客绑定,因此点击按钮即可触发下课学生请客的事件

虽然信号的参数个数可以多余槽函数/后一个信号的参数个数,但是类型一定要一一对应:

×

×

将上述的无参进行改写:

复制代码
void(Teacher::*teacherslot2)()=&Teacher::hungry;//无参的重载写法
复制代码
    void(Student::*studentslot2)()=&Student::treat;
复制代码
    connect(zx,teacherslot2,lj,studentslot2);//发出什么信号和用什么槽函数处理信号都要取地址,不加括号

之后再重新写一个信号连接信号的connect:

复制代码
 connect(btn,&QPushButton::clicked,zx,teacherslot2);//信号连接信号(发出信号的参数要多于接收的信号参数才行)

如果要断开信号,和connect括号里写的内容一样即可:

如果只修改btn,可以采用以下这种写法,btn2是看不到的:

此外如果在使用这个lambda表达式没有添加mutable这个参数,是不能修改m的值直接报错

添加之后点击按钮可以得到m的值,只有点击第一个按钮才会生成110(修改的一直是m的形参)点击第二个输出一直是10

使用这个表达式就可以实现调用有参函数的结果且不用定义其他:

复制代码
connect(btn,&QPushButton::clicked,this,[=](){
复制代码
        emit zx->hungry("宫保鸡丁");
复制代码
    });

结果如下:

最后新增一个按钮,一个实现无参用法,一个实现有参用法:

复制代码
//    第二个按钮
复制代码
    QPushButton *btn2=new QPushButton;
复制代码
    btn2->setText("关闭");
复制代码
    btn2->move(200,0);
复制代码
    btn2->setParent(this);
复制代码
    connect(btn2,&QPushButton::clicked,this,[=](){
复制代码
        emit zx->hungry("宫保鸡丁");
复制代码
    });

总结: