QT学习笔记-2021-1-21
自定义信号和槽重载处理
昨天已经把自定信号和槽写好了,今天需要把信号设置为带参的形式。
1、在teacher.h中加入同名带参函数hungry(QString foodname)
//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
2、在student.h与student.cpp中也声明并自定义同名带参函数treat(QString foodname);
//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.toUtf8().data();
}
3、在主窗口.cpp文件中测试,emit用于触发信号。
//MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPushButton>
#include"mybutton.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton * btn = new QPushButton;//创建按钮
btn->setParent(this);//给按钮设置setParent属性,使其作用在当前作用域下(在窗口上方显示)
btn->setText("QT第一个按钮");//给按钮设置文字
btn->setFixedSize(100,50);//设置按钮大小,(X,Y),X
QPushButton * btn2 = new QPushButton("QT第二个按钮",this);//第二个按钮
resize(800,600);//设置主窗口大小
btn2->move(100,100);//设置按钮坐标,起始坐标(0,0)位于窗口左上角,(X,Y)中X表示横坐标,Y表示纵坐标,
setWindowTitle("QT的第一个窗口标题"); //设置主窗口标题
MyButton * my = new MyButton; //创建自定义按钮
my->move(100,300);
my->setText("我自己的按钮");
my->move(300,0);
my->setParent(this);
this->st = new student;//在当前域下创建学生对象
this->te = new teacher;//在当前域下创建老师对象
// connect(btn, &QPushButton::clicked, this, &MainWindow::close);
// connect(te,&teacher::hungry,st,student::treat);
// overclass();
void (teacher:: *teachersignal)(QString) = &teacher::hungry;//定义函数指针指向teacher类中的带参数的信号函数hungry
void (student:: *studentslot)(QString) = &student::treat;//定义函数指针只想student类中带参数的槽函数treat
connect(te,teachersignal,st,studentslot);
overclass();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::overclass(){
emit te->hungry("番茄炒蛋");
}
运行控制台打印以下输出
小结:信号和槽函数发生重载时,需先定义函数指针指向明确的函数地址,再调用connect连接信号和槽,否则编译无法通过,因为编译器不知道你发送信号的函数是哪一个。QString 转为 char *的方式为
QString.toUtf8().data(),若不转换类型,控制台输出的是带双引号的字符串。
信号的连接
信号连接按钮
定义一个新的QPushbuton按钮,再将其连接触发信号函数overclass
QPushButton * newbtn = new QPushButton("下课",this);
newbtn->move(100,400);
connect(newbtn,&QPushButton::clicked,this,&MainWindow::overclass);
信号连接信号
先将信号函数地址改为之前无参的那个,因为信号函数的参数必须大于或等于槽函数参数,且参数类型必须一一对应。void (teacher:: *teachersignal)(void) = &teacher::hungry;
再做连接connect(newbtn,&QPushButton::clicked,te,teachersignal);
disconnect断开信号
disconnect(newbtn,&QPushButton::clicked,te,teachersignal);
Lambda表达式
形式:{}
[]是Lambda表达式的标识符
= 值传递
& 引用传递
() 参数
{} 实现体
mutable 修饰值传递变量 ,可以修改拷贝的数据,改变不了本体
[] ()->int 返回值(此例为int类型)