QT
QPushButton
QT中的对象树
QT中的坐标系
左上角为(0,0)点
QT中的信号槽
案例:点击按钮 关闭窗口
connect(信号发送者,发送的信号,信号接受者,处理的槽函数)
自定义信号和槽
头文件——>自定义信号写到signal下
connect(老师,老师饿了(信号),学生,请客(槽函数))
teacher类头文件:
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号 写到signals下
//返回值void
//只需要声明 可以有参数 重载
void hungry();
void hungry(QString foodname);
};
student类头文件:
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
//自定义槽函数写到这里 5.0版本一上 可以写成全局函数或者pubic作用域下 或者lamada表达式
//返回值void
//需要声明+实现
//可以重载
void treat();
void treat(QString fooname);
};
this->tc=new Teacher();
this->st=new Student();
//连接信号和槽
connect(tc,&Teacher::hungry,st,&Student::treat);
classOver();
void Widget::classOver()
{
//触发自定义信号
emit this->tc->hungry();
}
QString(打印出来会变双引号)转换为char*。
通过.toUtf8转为QByteArray 通过.data转为char*。
当信号和槽发生重载时候,需要利用函数指针明确指出函数地址
//连接有参信号和槽
//函数指针可以指向函数地址
void(Teacher::*teacherSignal)(QString)=&Teacher::hungry;
void(Student::*studentSlot)(QString)=&Student::treat;
connect(tc,teacherSignal,st,studentSlot);
classOver();
信号和槽拓展
1.信号可以连接信号
QPushButton *btn=new QPushButton("this",this);
void(Teacher::*teacherSignal2)()=&Teacher::hungry;
void(Student::*studentSlot2)()=&Student::treat;
//信号是可以连接信号的
connect(tc,teacherSignal2,st,studentSlot2);
2.可以断开信号和槽(disconnect)
3.一个信号可以响应多个槽函数
4.多个信号可以连接同一槽函数
信号参数可以多 槽可以不接受,参数类型要一一对应。
QT4版本的信号槽写法
Lambda表达式
[]中可以加= & a &a 推荐使用=
()里写形参列表
{}函数体实现
mutabl可以修改按值传递进来的拷贝
->type 代表lambda表达式返回值类型
int num=[=]()->int{
return 1000;
}();
//当进行信号和槽连接时 控件会进入一个锁的状态(只读)