目录
《Qt概述》
Qt是跨平台、C++面向对象的、图形用户界面应用程序
1990年奇趣科技开发
是Linux桌面环境KDE的基础
2014年开始跨平台了
Qt版本:商业版、开源版(帮助文档)
Qt安装:傻瓜式next,测试一般以最快的速度测试。
Qt的优点:
跨平台、简化了内存回收机制、可支持嵌入式开发
Qt成功案例:
Linux桌面环境、WPS、google earth、网络电话、…
《QtCreator简介》
QtCreator界面的介绍:
欢迎/编辑/设计/Debug/帮助/…
运行/调试/编译
创建一个工程:
a. Qt Weidget Application
b.Location 选择路径(英文路径)
c.Kits 构件套件,高低版本搭配
d.Detail类的信息,QWidget/QMainWindow/Qdialog
汇总 svn git
main函数介绍:
#include<QApplication> 包含应用程序的头文件
int main() {
Qapplication a(argc, argv); 应用程序对象有且仅有一个
//实例化一个窗口对象 mywidget父类->QWidget
myWigget w;
//窗口对象默认不显示
w.show();
//让应用程序对象进入消息循环机制,代码阻塞当前行
return a.exec();
}
《命名规范以及快捷键》
工程文件 .pro文件解释:
QT += core gui //Qt包含的模块
//大于版本4以上,包含widget模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = FirstProject //目标 生成的 .exe程序的名称
TEMPLATE = app //模板 应用程序模板 还有lib模板
SOURCES +=main.cpp\
mywidget.cpp
HEADERS += mywidget.h
mywidget.h 头文件解释
classmyWidget : public Qwidget
{
Q_OBJECT //宏,允许类中使用信号和曹机制
}
命名规范:
类名 首字母大写、单词之间首字母大写
函数名/变量 首字母小写,单词之间大写
快捷键:
注释 ctrl + /
编译 ctrl + b
运行 ctrl + r
字体缩放 ctrl + 滚轮
查找 ctrl + f
自动对齐 ctrl + i
同名之间的.h / .cpp切换 F4
帮助文档 第一种:F1/esc,第二种 左侧按钮"帮助",
第三种:安装目录bin中的Qt助手
《QPushButton创建》
默认编码为utf-8(中文不会出现乱码)
查询Qt助手 了解所属类,模块,公共函数等
QPushButton *btn = new QPushButton;
// btn->show(); show以顶层方式弹出窗口控件
//设置父亲 让btn按钮依附于myWidget窗口中
btn->setParent(this);
//显示文本
btn->setText("balabala");
//移动窗口
btn->move(x, y);//重置窗口的大小
resize(int w, int h); // 600*400
//设置固定窗口大小
setFixedSize(w, h);
//设置窗口标题
setWindowTitle("第一个窗口");
《对象树》
最祖宗辈的QObject对象
窗口做释放的时候,它会把其中所有的对象都给释放
当创建的对象在堆区的时候,如果指定的父亲是QObject或者是QObject派生下来的类,则可以不用管理释放操作。因为对象会放入对象树中。
《Qt的窗口坐标系》
Qt的(0,0) 点在左上角,X→,Y↓
《信号和槽-点击按钮关闭窗口》
connect(信号的发送者,发送的信号,信号的接收者,处理信号(槽))
信号和槽属于松耦合关系:信号和槽没有关系,用connect关联起来而已
打开帮助文档,查看组件的信号和槽函数,(signal和slot)
eg:connect(myBtn, &myPushButton::click, this, myWidget::close);
《自定义信号和槽》
自定义信号:
// 自定义信号,写在signals下
// 返回值是 void,只需要声明,不需要实现
// 可以有参数,可以重载
自定义槽:
// 早起的qt版本,必须卸载public slots下;高级版本则不考虑位置
// 返回值void;需要声明,也需要实现
// 可以有参数,可以重载
触发自定义信号
emit 自定义信号
《自定义信号和槽发生重载的解决》
需要利用函数指针 明确的指向函数地址
// 函数指针指向函数地址 // 成员函数的指针前面要加上作用域 void (Teacher::*teacherSignal)(QString) = &Teacher::hungry; void (Student::*studentSlot)(QString) = &Student::treat;
QString 转为char*
1. qDebug()<<"请老师吃饭,给他吃:"<<foodname.toUtf8().data()
2. qDebug()<<"请老师吃饭,给他吃:"<<foodname.toStdString().c_str()
《信号连接信号》
emit可以触发信号
函数指针指向重载过后的信号槽,
槽的实现可以使成员函数,也可以使lambda表达式
信号可以触发信号
断开信号 disconnect
《Qt4版本的信号槽连接》
拓展:
- 信号可以连接信号
- 一个信号可以连接多个槽函数
- 多个信号可以连接同一个槽函数
- 信号和槽函数的参数类型必须一致,但是个数可以不同,且信参个数>=槽参个数
Qt4版本:connect
// Qt4底层实现 SIGNAL("hungry"),SLOT("treat").
connect(zt, SIGNAL(hungry(QString)), st, SLOT(treat()));
优点:参数直观
缺点:类型不做检测
Qt5以上,支持Qt4版本的写法,反之不行。
《Lambda表达式》
lambda表达式是c11的新特性。
PS:在Qt5.4版本前,需要在.pro文件中,增加一个配置选项 CONFIG=C++11
1. 最简单的Lambda表达式,函数声明:[](){}
=:值传递
&:引用传递
a:值传递
=,&a,&b:除了a,b按引用传递,其他按值传递
&,a,b:除了a,b按值传递,其他按引用传递
2. 函数调用:在声明后加一对小括号:
[](){***
}();
3. 关键字mutable
可以修改按值传递进来的变量的拷贝,而不是变量本体
[m] () mutable {m = 100 +10; qDebug()<<m; }
4.Lambda表达式用法
// 点击按钮,关闭窗口
connect(brn, &QPushButton::clicked, this, [=](){
this->closed();
emit tz->hungry("老师来了"); //优点,lambda表达式可以是的无参信号触发有参槽函数
});
PS:如果connect的第三个参数是this,第四个参数是Lambda表达式的时候,this可以省略