首页 > 技术文章 > Qt入门基础知识(1)

tzbubble 2020-05-14 09:36 原文

Qt历史版本

  1. Trolltech公司:Qt1~3
  2. 诺基亚公司:Qt4
  3. Digia公司:Qt5

PS:Qt4和Qt5不能兼容,前者简易但是建议学习后者

开发方法

  1. C++ Qt
  2. QML(一套类似于XML的专门语言)
  3. PyQt

安装方法

  1. 下载地址

  2. mac下为dmg后缀安装包,win下为exe后缀安装包,ubuntu下为run后缀安装包。ubuntu下的run文件,需要先chmod 777 XXX,再使用./ XXX即可作为可执行文件运行

  3. 安装时候要选定全部安装,避免出现依赖问题。另外安装时要求登录,Qt密码格式为“@+字母组合+数字组合”

编译方式

  1. Debug: 保存编译信息,便于调试,不作任何优化

  2. release: 被优化以实现最小的代码和速度,生成执行文件的发布版本,没有调试信息

  3. profile:在执行软件期间分析CPU利用率和存储器占用率。它还可用于发现和分析异常和错误

目录文件

PS:手动编译方法

  • qmake -project ->.pro
  • qmake ->makefile
  • make ->可执行文件
  1. .pro文件:记录文件信息
  2. makefile:多文件编译时候告诉编译器有那些文件需要编译,不同平台下不同以实现跨平台。由Qt通过pro文件,根据平台不同自动生成
  3. .c和.h
  4. .o文件:编译中间文件
  5. .ui文件:视图,界面设计管理,将外观和功能代码分离(MVC设计模式,model+view+control)。Qt默认界面和控制分离,需要数据处理需要自己单独写。

两个主要学习目标

  1. 界面怎么写
  2. 怎么处理点击或其他用户事件

基类型

Qobject是绝大部分类的父类,任何对象都有一个唯一的objectName的属性
Qwidget是所有GUI的基类,具有外观

控件位置

坐标原点是窗口左上角,控件坐标是控件的左上角相对窗口左上角的位置

布局策略

为什么在“Lable+Line edit”的组合Layout中,对Layout进行拉伸,Lable长宽不会变而Line edit会变?
见Qwidget里的sizePolicy,即尺寸策略
常用的有三个:

  • Fixed:不变
  • Preferred:最佳(自适应,Qt自己的策略)
  • Expading:跟随拉伸
  • Ignored:忽略原来设定的宽高

另外,在布局之后可以在Layout的layoutStrench中进行布局内部控件占据比例的设定
也可以添加spacer(功能正如其弹簧形状所示)用于留出空白部分,以控制相对距离

PS:centralwidget上有一个“打破布局的禁止标”,是因为没有进行全局布局,可以点击centralwidget,再点击上方工具栏的布局,可以消除这个小标

缩放设置

在minimumSize和maximumSize中修改可以使得对于窗口的拉伸限制在一定范围。而将最大最小值设置为一致,则窗口为固定大小,不能进行缩放。

PS:mac下面有bug,最大最小值一致时,不能进行边缘拉伸,但是可以点按钮最大化,且最大化后不能最小化

Label下的文字设置

  1. Qwidget -> Font
  2. Qwidget -> stylesheet
  3. QLabel -> alignment

信号与槽机制

某个元素接收到什么信号 -> 某个元素执行什么动作

基础Qt的学习目标:

  • 有什么控件
  • 控件可以发出什么信号
  • 槽函数

信号与槽机制实现方法

最基本实现方法:
connect(谁,发出什么信号,谁,执行什么操作)
connect(this->ui->btn1,SIGNAL(clicked(bool)),this,SLOT(login()));
另外在某些需求时可以使用disconnect函数,用法同上

使用connect函数实现,需要修改三个地方:

  1. 在project.h中添加槽函数声明
    private slots:
    void login();
    
  2. 在project.cpp中,构造函数内,ui->setupUi(this);下方添加connect函数
  3. 在project.cpp末尾添加槽函数函数定义

信号与槽机制其它实现方法

  1. connect函数
  2. 在designer中右键控件,转到槽,会在project.c中自动生成函数块(代码量少,但不易读)。
    此方法除了在project.c中生成代码块,还会在自动在project.h的private slots里生成一个函数声明,删除的时候要注意一起删除,否则会报错。

ps: 另外还有两种实现方法,用的极少,暂不介绍

文档阅读

  1. 用索引Look for进行条目查询,若在对应contents内没有找到需要的内容,考虑是不是继承自父类,转向父类寻找

共性举例:

  • bool值属性:
    设置:set+属性名
    获取:(属性名 / is+属性名) 其一

  • int / icon值(等其他)属性:
    设置:set+属性名
    获取:属性名

Cmake

  1. 用编辑器编写源代码,如.c文件。
  2. 用编译器编译代码生成目标文件,如.o。
  3. 用链接器连接目标代码生成可执行文件,如.exe。

make指令根据makefile文件进行批量编译
cmake指令根据cmakelist文件自动生成makefile文件

推荐阅读