1.1模块功能
1.2命名规范:
类名 首字母大写,单词和单词之间首字母大写
函数名 变量名称 首字母小写,单词和单词之间首字母大写
1.3对象树
用于堆区内存自动回收。当创建的对象在堆区时候,如果指定的父亲是 QObject 派生下来的类或者 QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。
在创建 QObject 对象或QObject子类派生类的对象时,可以提供一个其父对象,创建这个 对象时会自动添加到其父对象的 children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。
1.4QT中的坐标系
1.5信号与槽
-
一个信号可以连接多个槽
-
多个信号也可以连接同一个槽函数
-
信号和槽的参数和类型必须对应
-
信号的参数个数可以多于槽的参数个数
-
信号可以连接槽或信号
-
一个信号可以连接多个槽函数
-
多个信号可以连接同一个槽函数
-
信号和槽函数的参数必须类型一一对应
-
信号的参数个数可以多于槽函数的参数个数,反之不行
-
信号与槽可以断开连接disconnect()
连接函数connect()
//1.信号发送者;2.发送的信号;3.信号的接收者;接收的槽函数
connect(te,&Teacher::hungry,st,&Student::treat);
disconnect(te,&Teacher::hungry,st,&Student::treat);
优点:松散耦合
自定义信号:
1.写到 signals下
2.返回 void
3.需要声明,不需要实现
4.可以有参数,可以重载
自定义槽:
1.写到 public slot下 或者 public 或者全局函数
2.返回void
3.需要声明,也需要实现
4.可以有参数,可以重载
自定义信号与槽
//在老师类中定义信号
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号 写到signals下
//返回值是void ,只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
void hungry(QString foodName);
};
//在学生类中定义槽
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
public slots:
//早期qt版本 必须要写到public slots,高级版本可以写到 public或者全局下
//返回值void ,需要声明,也需要实现
//可以有参数,可以发生重载
void treat();
void treat(QString foodName);
signals:
};
void Student::treat()
{
qDebug() << "老师请客吃好吃的!";
}
void Student::treat(QString foodName)
{
// qDebug() << "老师请客,吃:"<<foodName;
//QString->Utf8->*char类型,则可以解决输出带“”
qDebug() << "老师请客,吃:"<<foodName.toUtf8().data();
}
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_close_clicked();
private:
Ui::Widget *ui;
Teacher *te;
Student *st;
void classIsOver();
};
//调用
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->te=new Teacher(this);
this->st=new Student(this);
//这里的this是给创建的对象指定父,将该对象加入父对象树,实现对象的自动释放
QPushButton *btn=new QPushButton("下课铃响了",this);
this->resize(600,400);
void(Teacher::*teacherSigna2)(QString) = &Teacher::hungry; //告诉他这个信号是有参的
void(Student::*StudenTreat2)(QString) = &Student::treat;
connect(te,teacherSigna2,st,StudenTreat2);
classIsOver();
//1.不发生重载时信号与槽连接
// connect(te,&Teacher::hungry,st,&Student::treat);
//2.发生重载时信号与槽通过函数指针连接
void(Teacher::*teacherSigna)(void) = &Teacher::hungry; //告诉他这个信号是有参的
void(Student::*StudenTreat)(void) = &Student::treat;
connect(te,teacherSigna,st,StudenTreat);
classIsOver();
// //3.信号连接槽,槽中触发的信号在连接槽
// connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
//4.信号连接信号,由第二个信号连接槽
connect(btn,&QPushButton::clicked,te,teacherSigna);
// //5.断开连接
// disconnect(btn,&QPushButton::clicked,te,teacherSigna);
//6.QT4中写法(QT4用函数名字符串匹配,对类型不匹配,QT5用函数指针地址匹配,)
connect(btn,SIGNAL(clicked()),te,SIGNAL(hungry()));
//7.Lambda表达式,实现一对多
connect(btn,&QPushButton::clicked,[=](){
// this->close();
// emit te->hungry("宫保鸡丁");
btn->setText("俺改名了");
});
// qDebug()<<"hhkkkk";
}
void Widget::classIsOver()
{
// emit te->hungry();
emit te->hungry("宫保鸡丁");
}
/*输出
老师请客吃好吃的!
*/
补充知识:Lambda表达式
Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。
- Lambda表达式函数声明 {}
[函数对象参数](操作符重载函数参数)mutable ->返回值{函数体}- [] 不可使用任何局部变量
- [=] 允许使用局部变量,通过值传递
- [&] 允许使用局部变量,通过应用传递
- [变量a] 允许变量a使用值传递
- mutable 可修改值传递进来的参数,虽然还是局部变量,如[变量m]()mutable{m+=100;打印}; 不加mutable会报错
- ->类型 为匿名函数返回值,如int ret =[]()->int{return 1000}();
- Lambda表达式函数的调用 {}()
- 这里最常见的={}使用方式
MainWindow
- 菜单栏 QMenuBar
- 工具栏 QToolBar
- 状态栏 QStatusBar
- 铆接部件 QDockWidget(浮动窗口)
- 中心部件,如 QTextEdit
- 资源文件,实现按钮的的图标显示
- 对话框QDialog
分为模态对话框(阻塞)和非模态对话框(非阻塞)
消息对话框(模态对话框)- 错误对话框 QMessageBox::critical(this,“critical”,“错误”);
- 信息对话框 information
- 提问对话框 question
- 警告对话框 warning
- 颜色对话框 QColorDialog
- 文件对话框 QFileDialog
- 字体对话框 QFontDialog
更新中。。。
https://www.bilibili.com/video/BV1g4411H78N?p=10&spm_id_from=pageDriver&vd_source=07c19be7e433a8cd75d9808899f4c9d9