Qt学习笔记-DAY1
目录
1.简介
2.创建一个Qt项目
2.1 创建
开始 | 步骤 |
---|---|
1. | |
2. | |
3. | |
4. | 先选择Qweight |
5. |
2.2 mian.cpp分析
#include "hxywidget.h"
#include <QApplication> //包含一个应用程序类 头文件
//mian程序入口 argc:命令行变量 数量 argv:[]命令行变量数组
//鼠标键盘的输入都存到 argc argv[]
int main(int argc, char *argv[])
{
//a:应用程序对象,在Qt中 应用程序对象 有且只有一个
QApplication a(argc, argv);
//w:窗口对象 hxyWidget为QWidget子类
hxyWidget w;
//w窗口对象调用show方法才会显示
w.show();
//让 应用程序对象 进入消息循环 随时相应用户消息
//让 代码阻塞到这行~
return a.exec();
}
2.3 工程文件分析
#-------------------------------------------------
#
# Project created by QtCreator 2020-12-24T17:02:22
#
#-------------------------------------------------
QT += core gui ## Qt包含的模块core、gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ##大于4版本以上 包含 widget模块
TARGET = hxy12 ##目标-生成的.exe//程序的名称
TEMPLATE = app ##模板-应用程序模板 Application
DEFINES += QT_DEPRECATED_WARNINGS
##源文件【自动】
SOURCES += \
main.cpp \
hxywidget.cpp
##头文件【自动】
HEADERS += \
hxywidget.h
2.3 头文件分析
#ifndef HXYWIDGET_H
#define HXYWIDGET_H
#include <QWidget> //头文件
class hxyWidget : public QWidget
{
Q_OBJECT //Q_OBJECT宏:允许类中使用信号和槽
public:
hxyWidget(QWidget *parent = 0); //构造函数
~hxyWidget(); //析构函数
};
#endif // HXYWIDGET_H
2.4 代码架构分析
3.Qt 若干重要概念
3.1 命名规范&快捷键&帮助文档
命名规范:
类名首字母大写、单词和单词之间首字母大写、函数名变量名称首字母小写、单词和单词之间首字母大写
快捷键:
- 注释————ctrl +/
- 运行————ctrl +r
- 编译————ctrl + b
- 字体缩放——ctrl+鼠标滚轮
- 查找————ctrl +f
- 整行移动——ctrl + shift+ ,
- 帮助文档—— F1
- 自动对齐—— ctrl +i
- 同名之间的.h和.cpp切换——F4
3.2 对象树
简化了内存回收机制
你只管new对象~ 会自动从下往上释放~~
只要你setparent()
万物皆为QObject 子类
这个QObject对象会自动添加到其父对象的children()列表
当父对象析构的时候,这个列表中的所有对象也会被析构
3.3 坐标系
左上角为 0 , 0 点-----x以右为正方向-----y以下为正方向
3.4 信号&槽【重点】
3.4.1 控件的信号&槽
连接函数 :connect |
---|
参数1 信号的发送者 |
参数2 发送的信号(函数地址) |
参数3 信号的接受者 |
参数4 处理的槽函数 (函数的地址) |
Qt4版本写法connect(zt,SIGNAL(hungry()) , st , SLOT(treat())) |
Qt4版本优点:参数直观,缺点 :类型不做检测
其中:
clicked为QPushButton类自带的signal、close为QWidget自带槽函数
myWidget::myWidget(QWidget *parent): QWidget(parent)
{
MyPushButton * myBtn = new MyPushButton;
myBtn->setText("我自己的按钮");
myBtn->move(200,0);
myBtn->setParent(this); //设置到对象树中
connect( myBtn, &MyPushButton::clicked, this, &myWidget::close );
}
3.4.2 自定义信号&槽
1.自定义信号 | 2.自定义槽函数 | 3.触发自定义的信号函数 |
---|---|---|
写到 signals下 | 写到 public slot下 或者public 或者全局函数 | emit |
返回void | 返回void | emit”对象“->”信号“ |
需要声明,不需要实现 | 需要声明 ,也需要实现 | 【先连接后 再触发才有用】 |
可以有参数 ,可以重载 | 可以有参数 ,可以重载 |
注意:
①信号可以连接信号
②一个信号可以连接多个槽函数、多个信号可以连接同一个槽函数
③信号和槽函数的参数 必须类型一一对应
④信号的参数个数 可大于槽的参数个数 要求
⑤当自定义信号和槽出现重载 (多种传参情况):
需要利用函数指针 明确指向函数的地址 ---- 函数指针 -> 函数地址
{
//自定义 函数指针 *teacherSignal、*studentSlot
void(Teacher:: *teacherSignal)(QString ) = &Teacher::hungry;
void(Student:: *studentSlot)(QString ) = &Student::treat;
connect(zt,teacherSignal,st,studentSlot);
}
例子:下课后,老师触发饿了信号,学生响应信号,请客吃饭
Teacher .h 类
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = 0);
signals:
void hungry();
void hungry(QString foodName);
public slots:
};
Student.h 类
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = 0);
signals:
public slots:
void treat();
void treat(QString foodName);
};
Widget .h 主窗口类
#include "teacher.h"
#include "student.h"
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Teacher * zt;
Student * st;
void classIsOver();
};
Widget.cpp
void Widget::classIsOver()
{
//下课函数,调用后 触发老师饿了的信号
//emit zt->hungry();
emit zt->hungry("宫保鸡丁");
}
Widget::Widget(QWidget *parent) :QWidget(parent),
{
//创建一个老师对象
this->zt = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);
//老师饿了 学生请客的连接
connect(zt,&Teacher::hungry,st,&Student::treat);
//调用下课函数
classIsOver();
}
3.5 Lambda表达式(相当于一个万能的槽)
Lambda表达式 | 最常用:[=] () {} |
---|---|
1. | []为标识符 匿名函数 |
[=] 值传递 | |
[&] 引用传递 | |
2. | () 参数 |
3. | {} 实现体 |
4. | [] () ->int {}返回值 为int |
利用lambda表达式 实现点击按钮 关闭窗口
{
QPushButton * btn2 = new QPushButton ;
btn2->setText("按钮1");
btn2->move(100,0);
btn2->setParent(this);
//可以省略this
connect(btn2,&QPushButton::clicked, this,[=](){
this->close();
btn2->setText("关闭");
});
}
4.控件—Qpushbutton
在主窗口.cpp 的构造函数里添加控件
4.1 按钮控件常用api
4.1 创建 QPushButton * btn = new QPushButton
4.2 设置父亲 setParent(this)
4.3 设置文本 setText(“文字”)
4.4 设置位置 move(宽,高)
4.5 重新指定窗口大小 resize
4.6 设置窗口标题 setWindowTitle
4.7 设置窗口固定大小 setFixedSize
4.2 第一种创建
QPushButton * btn = new QPushButton; 头文件 #include <QPushButton>
//设置父亲
btn->setParent(this);
//设置文字
btn->setText("德玛西亚");
//移动位置
btn->move(100,100);
4.3 第二种创建
//第二种创建
QPushButton * btn2 = new QPushButton("孙悟空",this);
//重新指定窗口大小
this->resize(600,400);
//设置窗口标题
this->setWindowTitle("第一个项目");
//限制窗口大小
this->setFixedSize(600,400);
学会看help文档