跨平台的c++图形用户界面应用程序框架,
创建qt程序:
名称不能有空格中文,路径不能用中文路径
默认创建有窗口类,mywidget,基类有三种
qwidget 父类 只有一个空窗口
qmainwindow 多了菜单栏,状态栏
qdialog 多了对话框
创建界面。如果勾选上,则会多出一个设计界面,可以拖拽一些直接用的控件
添加版本控制系统 (svn vss git)在多人合作开发时用到版本控制系统
#include"mywidget.h"
#icnlude //包含一个应用程序类的头文件
int main (int argc,char argv[])
{
QApplication a(argc,argv);
myWidget w;
w.show();
return a.exec();//让应用程序对象进入消息循环机制,让代码阻塞到这行
}
QApplication 应用程序对象类,在qt中,应用程序对象有且仅有一个,类似int
myWidget 窗口对象类。
窗口对象默认不会显示,必须调用show方法
消息循环是个机制,类似一个死循环 点窗口的×才会退出
对象树的基本概念
工程文件中
QT += core gui #QT包含的模块核心和图形模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #大于4版本以上保安widets模块。因为5版本以上才增加的widget模块,之前是包含在gui模块中
TARGET = untitled #生成的.EXE文件的名称
TEMPLATE = app #模板 :应用程序模板
SOURCES += main.cpp\ #源文件增加XXX
widget.cpp
HEADERS += widget.h #头文件增加XXX
#ifndef WIDGET_H
#define WIDGET_H
#include
class Widget : public QWidget
{
Q_OBJECT //Q_OBJECT宏,允许类中视野信号和槽的机制
public:
Widget(QWidget *parent = 0); //构造函数
~Widget();
};
#endif // WIDGET_H
命名规范与快捷键
命名规范:类名 首字母大写,单词和单词之间的首字母大写
函数名 变量名称 首字母小写,单词和单之间接首字母大写
快捷键:
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找 ctrl + f
整行移动 ctrl + shift + ↑或↓
帮助文档 F1 或左侧按钮 或
自动对齐 ctrl + i
同名文件.h与.c切换 F4
帮助文档的使用
例如找一个QPushbuttom 类的使用
qmake 表示在哪个模块 (如果没有需要在pro文件中加上)
inherits 表示他的父类是谁
inherited by 表示子类
qmake 中没有的在第一行加入
创建窗口与创建按钮
一般功能函数有多个重载函数,可以选择。
因为按钮的五类也是widget。所以 ,要显示出来也要用函数
show函数是显示在单独窗口的
所以要设置一个父类对象
this就是指向当前对象的指针
设置父亲 setParent(this)
设置文本 setText(“文字”)
设置位置(坐标)move(X,Y)
重新指定窗口大小 resize
设置窗口标题 setWindowtitle
设置窗口固定大小setFixedSize
对象树
在QT中创建对象会提供一个Parent对象指针
QObject 是以对象数的形式组织起来 (QObject 是所有类的父类)
当创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是parent,也就是父对象指针。
这相当于在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表
当父对象析构的时候,children列表中的所有对象都会被析构。即释放的时候就会释放
创建的对象在兑取时候,如果指定的父亲是QObject的子类或派生下来的类可以不同管理释放的操作,将对象放入对象数中,析构父类的时候会先检查是否有子类,然后先析构子类,在析构父类。一定程度上简化了内存回收操作。
信号和槽的基本使用及拓展(重点)
connect 函数的四个参数 引号发送者,发送的具体信号,信号的接受者,信号的处理(槽) 槽就是处理的函数。
信号槽的优点:松散耦合,信号发送端和接收端本身是没有关联的。通过connect链接,将两端耦合在一起
例:按钮按下关闭窗口
找按钮的信号需要去帮助文档中找
可以看到信号是从各个父类中继承,点进去找信号。
toggled 切换,用于bool值
槽(slot)函数的寻找
因为要关闭窗口(是按钮的父类)所以去widget里面找槽函数
第五个,点进去
点进close可以看函数介绍
可以写mypushbutton也可以写Q pushbuttom
自定义的信号和槽
创建两个新类。创建的类不属于任何控件, 父类可以选择QObject
创建对象前应现在widget头文件中声明一下
emit 触发自定义 信号 信号只声明不实现,槽函数需要实现,
自定义信号:写到signals下,返回void,需要声明不需要实现,可以有参数可以重载。
自定义槽函数:返回void,需要声明也需要实现,可以有参数,可以重载,写到public slot下货public下或全局函数。后两种方法仅限高版本使用。
自定义信号和槽重载
需要用函数指针明确指向函数地址
比如加入参数
在emit 中传入信号参数
数=
当信号发生重载时。编译器不知道找哪个地址 需要做以下处理
函数指针明显是说明什么参数了,因此等号右边会自动识别
qstring打印出来会带引号,转换成char就不会。QT中需要先转成QByteArray(toutf8 是QT中的一种Qbytearray) 在转char
.toutf8是转bytearray的函数,data 是bytearray中的函数,可以在帮助中找到
信号连接信号
一个信号触发另外一个函数
用按钮触发下课
disconnect 断开信号
总结:
1、一信号可以连接多个槽函数
2、多个信号可以连接同一个槽函数
3、信号和槽函数的参数必须类型一一对应
4、信号可以连接信号
5、信号参数个数可以多于槽参数个数
QT4版本以前的信号和槽的连接方式
用一个纯大写的signal然后从里面选择信号,槽同理,但是重载情况下,不用定义指针了直接可以选择有无参。缺点:类型不做监测。
connect(zt,SIGNAL(),st,SLOT());
**
**
用于定义并创建匿名的函数对象,简化变成工作
表达式基本构成
[capture] (parameters)mutable->return-type
{
statement
}
[函数对象参数](操作符重载函数参数)mutable->返回值{函数体} ()
函数对象参数
[]表示一个lambda的开始,必须存在 。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义lambda为止时lambda所在作用范围内可见的1、局部变量(包括lambda所在类的this)。函数对象参数有以下形式:
空,没有使用任何函数对象参数
= 函数体内可以使用lambda 所在作用范围内所有可见的局部变量,是以值传递方式。
& 函数体内可以使用lambda所在作用范围内所有可见的局部变量,是以引用传递方式
this 函数体可以用lambda所在类中的成员变量
a, 将a值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认函数是const的,要修改传递进来的a的拷贝,可以添加mutable修饰符。
&a 将a按引用进行传递
a,&b,将a按值传递,b按引用
=,&a,&b 除a,b用引用其他用值传递
2、操作符重载函数
标识重载的()操作符的参数,没有参数时,这部分可以省略。参数可以通过按值如(a,b)和按引用(&a,&b)两种方式进行传递
3、可修改标识符
mutable声明,可省略,按值传递函数对象参数时,加上此修饰符可以修改按值传递进来的拷贝(不是改值本身)
4、函数返回值
-> 返回值类型 当返回值为void或者函数体中只有一处return的地方。可以省略
5、函数体,{}便是函数的实现们不能省略,但是函数体可以为空
6、()指执行函数。 如果在类似connect 的函数中不需要加最后的小括号。