Ubuntu中的Qt学习与开发


匹配学习视频 B站学习视频

一 Qt简介及Qt开发环境讲解

1 Qt简介

Qt是基于C++的,使用Qt开发的软件在多个操作系统上可以很简单的移植,Qt开发界面提供丰富的帮助文档支持,并给出实例代码,能够极大的加速开发进程,使得人们可以专注于软件的开发逻辑而不用管界面规划。
Qt的界面可以使用Ps的贴图,进行分割切块后作为背景使用,可以使得界面非常漂亮。还可以做特效,使用后台时间控件做图片切换,或者使用GIF格式动图。

2 项目创建路径

Qt Creator ——欢迎——new——Application(Qt)、Qt Widgets Application——设定名称、路径——qmake——base class 选择QWidget(选择QWidget作为基类,它是继承的最为广泛的)、其他默认——勾选Select all kits(很重要,否则文件显示不全)——其他步骤全默认——完成创建。
在这里插入图片描述

这里还要多说一下,Qr Craetor 所提供的新建项目默认基类只有QMainWindow、QWidget和QDialog这三种,这三个也是用的最多的。QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框类,而二者全部继承自QWidget类,不仅如此,其他所有窗口部件也都继承自QWdget类。继承关系如下图所示。
继承关系图

3 一个重要的功能Debug调试功能

Debug功能可以容易的发现代码中的问题,可以在右上角界面中展示代码中各种变量的值及其变化,对于右上角没有展示出来的变量尼,也可以选中变量名称,右键单击,选择“添加表达式求值器”选项,这样就能在右下角显示出该变量,并允许对该变量进行重新赋值。调试模式允许从某行开始逐行运行代码、深入到函数内部逐行运行、跳过函数内部逐行运行等等。
在Debug模式下,左键单击行序数左侧空白处可以在此行设置断点,然后诊断运行(运行模式下方带虫子的那个)的时候,代码会在断点处停止,直到再次点击这个断点,代码才会继续运行,施加断点搭配逐步运行效果很棒。
在Debug模式下,具有变量搜索对话框,输入变量名称并锁定搜索范围能够高亮显示所搜索的变量名称,帮助我们定位所有的该变量所在位置并按顺序给出所有该变量所在代码行。
在Debug模式下,具有应用程序输出对话框,在应用程序输出对话框中输出程序的规范结果,问题则在问题

4 设计功能

只有在界面文件(.ui格式)下才会启用设计界面,在设计界面里,可以通过拖拉控件的方式很简单的塑造可视化界面,具有“所见即所得”的特性,相对于Qt Quick编程的优点是节约时间,设计过程直观又简单。缺点就是自由度相对较低。
Qt Quick编程语言类似于网页HML编程语言,能够对界面进行设计,优点是自由度高,缺点是容易出bug、代码行数很多。
无论是ui界面的设计模式还是Qt Quick的编程模式影响的都只是界面的设计模式,软件的内在逻辑部分都需要使用C++来完成。

5 项目移植

从别的地方移植来的项目代码时候一定要注意不能丢了项目文件(.pro),项目文件里记录着关于版本、项目文件数量、项目文件名称、引用的库等等一系列信息,很重要。还有就是需要把用户信息文件(.user)删除掉。

6 软件的发布

在QtCreator界面左侧栏有个显示屏的图标,点击会有几个选项:Build、Release、Debug和Profile,分别对应运行程序后所生成的四个软件版:构建版、发布版、调试版、和XX版,其中程序是一样的,主要差别是所包含信息多少的不同(数据量可能有十几倍的差别),Release版生成的一些列文件就是交付软件。所生成的文件夹和项目在同一路径下,名字后缀就是版格式
在release版下调试可能会报错,因为发布版是不能包含调试信息的。

二 示例:登录界面布局讲解

1 部件介绍

窗口部件放置后,长按鼠标左键可以拖动位置。如果知道部件名字(没有全称也可)的话,可以在部件框顶部的搜索框(FILter)检索部件。部件栏在编辑窗口的左侧
单击的按钮:Push Button
文本标签:Label
单行的字符输入:Line Edit
横向占位工具:Horizontal Spacer
竖向占位工具:Vertical Spacer

2 实现部件屏幕居中摆放

想让部件始终保持在窗口中央,且不随着缩小和放大窗口而产生尺寸变化,就是本节的内容。
首先介绍一些功能,在软件界面编辑界面的上方有一行窗口编辑工具栏:
在这里插入图片描述

有个功能是竖直放置(lay out vertically),这个功能可以让被选中的部件们水平排成一排。
还有个功能是水平放置(lay out horizontally),这个功能可以让被选中的部件们竖直排成一排
栅格排列(lay out in grid),这个功能使得被选中的部件们呈网格状排列。
还有一个取消放置功能。
使用竖直放置、水平放置和栅格排列使得部件成为一个整体,然后在部件的上下左右分别放置一个或数个占位工具,上下放竖直占位工具,左右放水品占位工具,占位工具可以产生弹性空格填充,然后将复数个的占位工具与待展示部件联结为一个整体,最后点击空白处,点击栅格排序,使之呈现如下图示:
在这里插入图片描述

此时点击运行后,无论窗口放大还是缩小,中间待显示部件始终在窗口的中心处,且大小不会随着窗口改变。

三 示例:登录界面功能介绍讲解

1 Tab的切换次序设定

窗口中,可以使用Tab切换按键和输入框(Line Edit)的选择,这个切换是有一定次序的,同样可以在窗口编辑工具栏中找到,然后按照应有的次序重新设定切换次序。
如果按键或者输入框无法通过Tab切换,则要在属性栏中查看其focusPolicy是否设定为StrongFocus。属性栏在编辑窗口的右下角

2 输入框(Line Edit)输入的形式

在输入密码等字符的时候我们不希望别人看到输入的是什么,这就要在输入框的属性中对于其编码方式进行设定。
选中要更改属性的输入框,在窗口右下角找到属性栏,下拉找到echoMode属性,更改为password或者其他需要的形式,normal是正常显示,password是只显示圆点·代替字符,passwordEchoOnEdit是输入的时候显示字符,离开输入框的时候显示圆点· 。
除了用属性栏更改以外,也可以通过代码更改部件的属性方法如下:
首先打开源文件Widget.cpp,在这个源文件中可以对窗口的属性进行设定。
在这里插入图片描述

红框中的代码是后添加的,他的意思还是对名字为“linePassWord”的输入框的编码显示进行设定(setEchoMode),设定为(QLineEdit::Password)就是用圆点来代替字符显示。在这里ui包含窗口部件所有所需的类和属性,所有的东西都在这个ui中,输入ui->后就能看到一系列的可选择的对象(部件等),
在这里插入图片描述

选择名字叫linePassWord的输入框,linePassWord是我给密码输入框的命名,以便于在这样的设定时候很快的找到我想找的部件。找到后点击,再输入->,代码就变为
在这里插入图片描述

在下拉框中找到setEchoMode,然后在setEchoMode参数输入括号中打入两个双引号“”,结尾添加分号;作为结束。加双引号的目的是为了一会儿使用帮助文档来检索参数怎么填,不加双引号帮助文档不识别。
在这里插入图片描述

将光标放在setEchoMode里,然后按F1打开帮助文档,选择默认检索器,后弹出setEchoMode的介绍
在这里插入图片描述

点击绿色的EchoMode,直接转到参数填写介绍
在这里插入图片描述

则根据介绍,复制我们想要的填写的参数,替换“”粘贴到setEchoMode的参数括号中。
在这里插入图片描述

然后运行即可。这个方法也可以设定其他部件的属性值。其遵循的规则就是:ui——部件——属性名称——属性参数设置的规则。ui包含可视化设计的一切。

3 按钮功能的实现1

按钮不是装饰,按下去是要有反应的,所以需要设定按钮的事件逻辑。
以上面示例中的取消按钮为例(button of cancal),我们想要其具备的功能是:单击取消键关闭界面窗口。
根据通信的原理,首先要有个信号产生部件(按钮),然后产生一个信号(比如点击、双击、长按等等),信号传输到接收信号部件(),然后信号接收部件根据信号内容和类型,按照一定的事件逻辑执行某些动作(函数声明、函数内容定义等)。信号不仅有产生者、接受者,还有一个绑定的过程,让二者对接到一起
本项目中,按钮是信号的产生者,信号接受者是当前对象,处理这个信号的是当前的槽,结果是关闭当前对象,绑定是在头文件中声明的,绑定过程由代码生成器生成(此过程我们看不见)
方法1:点击所要3设置的按钮部件,右键展开菜单栏,选择选项“转到槽(go to slot)”,弹出对话框,选择信号为QAbstractButton——clicked(),然后界面会转到源文件Widget.cpp中,并自动在此源文件中,生成函数声明:
在这里插入图片描述

同时在头文件Widget.h中生成对该函数的声明
在这里插入图片描述

在源函数文件中的这个函数中,对点击取消键的之后的事件逻辑进行定义:关闭该窗口,使用this指针指代当前窗口,选择功能关闭。
在这里插入图片描述

然后运行编译即可。

4 按键功能实现2

上节设定的是取消按钮,本节设定登录按钮的逻辑:如果ID输入和password输入一致的话,则在界面显示登录成功;如果ID输入和password输入不一致的话,则在界面显示登录失败。
和上节一样,右键单击按钮,选择转到槽,选择点击,自动转到源文件生成的函数定义处。
想要比较两个输入文本是否一致,首先要把两个文本从输入框中提取出来,然后将二者进行对比。
ui中包含部件所有的属性和功能,所以使用代码ui->lineEdit_name->test()来取出输入框中的字符串,然后声明一个Qt的字符串变量(QString),将从输入框中取出的字符串放到这个变量中,代码如下:
在这里插入图片描述

对比两个字符串是否一致要使用字符串命令,光标置于变量声明的QString处按F1,打开帮助文档直接定位于QString的介绍处,下拉找到字符串对比命令“operator==”,这是运算符的重载,故直接使用“==”就可以对比两个字符串是否一致。
使用条件语句判断两个字符串是否一致,一致则返回信息“登录成功”。这里采用Qt中的debug模块来进行信息输出,这是因为Qt是由C++封装成的,C++中的输入输出是cin和cout,这在Qt被进一步封装进调试模式了,在调试模式中的QDebug包中(这里多提一嘴,Qt中所有的头文件后面都没有.h,包叫什么名,其对应的头文件名字就是什么,没有后面的.h,不要画蛇添足),在源文件开头添加代码行引入Qt的debug包:#include <QtDebug>
在这里插入图片描述

光标置于库名处,按F1获取调试库debug相关文档(不用看命令,直接找细节描述(Detailed Description)和基本用法(Basic use),可以很快学得一个库的用法),根据文档,编写消息提示代码:qDebug()<<”String”
在这里插入图片描述

编译运行即可

四 手动编译Qt源代码

在我们仅有头文件和源文件(界面由源文件完全定义)的情况下,手动编译,使之生成可执行的应用程序。主要过程分3步(在有源文件、头文件和界面文件(界面由源文件和界面文件共同定义)时候步骤也是完全一样的)。本章可以增进使用者对于Qt代码编译过程的理解,有很大的学习意义。

1 第一步:生成解决方案

对已有的头文件和源文件,使用Qt的qmake生成工程文件(.pro),然后对工程文件中缺失的内容进行补充,当然,报错的时候再补充也可以。
首先打开终端,找到Qt中qmake包的位置,获取其帮助文档和路径
在Qt安装目录的bin文件夹下找到qmake,右键启动终端,在命令行输入命令:pwd,然后复制qmake的路径。

pwd路径

复制好路径后,打开待处理的源文件和头文件所在的文件夹,右键打开终端,在命令行处将路径粘贴进去,不补全代码:

/qmake -project

然后就可以看到,文件夹中多了一个.pro的方案文件。
打开方案文件,查看里面内容,可以看到其中缺少对于Qt头文件和库文件的定位声明,将代码:QT += core gui widgets添加到这个文件中。

2 第二步:对所有文件进行编译,生成Makefile文件

在工程文件夹中,右键打开终端,粘贴并补全qmake的路径,敲击回车即可。

路径

3 第三步:生成可执行文件

直接在命令行输入命令:make即可。
在命令行输入:

./filename

去执行这个文件,然后就可以了。
直接将界面文件(.ui)转换为头文件(.h)的方法
在Qt中提供直接的将界面文件转换为可供执行程序使用的头文件的方法,在qmake相同目录下,有一个包叫uic,在终端输入命令:

路径/uic filename1 -o filename2

,这样就把界面文件filename1转换为C++文件filename2。
通过uic命令转换出来的文件和使用make出来的文件是完全一样的。uic就是把.ui文件中类似于XML的代码转换为C++代码。而设计界面之所以能够将界面直观的显示出来,是因为它提供了一个解释器,能够对.ui中的代码进行解释。

五 手动绑定信号和槽

根据C++中的通信的原理,完成通信需要三个元素,信号产生者、绑定、信号接受者及处理,在Qt中,信号产生者就是部件,绑定在头文件中声明,信号接受者可以是当前对象也可以是别的什么东西,然后再定义函数去处理这个信号。在一个简单加法计算器中(两个数字输入,一个运算符输入,点击按钮,输出结果),点击按钮就是信号,在头文件中声明函数,在源文件中定义函数。

1 按钮的槽绑定及设计

按钮的槽也遵循上面的陈述规律:主要要考虑的内容有三部分:首先是要在头文件中声明这个槽及其对应的处理函数,然后在源文件中将槽、处理者、处理函数绑定,最后在源文件中将处理函数定义出来。
头文件中声明槽及其处理函数:
在这里插入图片描述

这是一个事件,所以需要用关键字private,声明的处理函数doProcessClick是对信号处理,没有返回值,输入是点击信号,类型是bool(这是根据绑定函数中对应的参数要求定义的出来的,但是点击按钮的参数类型都是这个bool型)。
在源文件中,将按钮、信号处理者、处理函数绑定:
在这里插入图片描述

绑定函数是QObject类中的connect函数,里面有四个参数输入,分别是信号产生者(指针)、信号类型、信号接受者(指针)、处理函数。注意到信号类型是clicked,类型是bool型。信号接受者是当前对象,使用this指针。处理函数是头文件中声明的处理函数。SIGNAL和SLOT都是宏(现在还不知道是啥,以及为什么这么写,这些是C++的语法)。
绑定完以后在下面定义处理函数doProcessClick(bool)。
在这里插入图片描述

函数无返回值(void),输入参数为bool型的点击信号,为了调试,若按钮点击则发送信息show到控制台。

2 处理函数的设计

我们想要达到的功能是两个数字输入,一个运算符输入,点击按钮,输出结果,我们现在有三个输入框,一个按钮,其中按钮一经绑定声明好了。
输入框输入的是QString类型的量,要想进行数学运算,那就要把它们转换成为int型或者float型,而且还要判断输入的合规性,看转换是否成功,转换完以后根据输入的运算符号,进行计算,尤其要注意除法时候要检验被除数是否为0。然后再将结果由数字转换为字符串输出(因为结果输出框只能输出字符串QString)。
在这里插入图片描述

为了让代码显示完全,将if语句都写在一行了,良好的风格应该是换行的,才有层次感,更易读。将数字转换为QString类型的方法在QSrting的帮助文档中,且给出了示例,变量类型的转换贯穿全代码,输入框的提取和显示也以QString类型为核心。下面简单介绍一下QString的常用命令:
1、QString()的构造函数可以把【】转化为QString类型,不是所有的都能转换,根据帮助文档,可以把Char类型、Char*类型、ByteArray类型、String类型等等。
2、append字符串拼接,能拼接的类型和1一样。
3、arg是字符串格式化拼接,类似于printf。
4、chop是字符串倒位剔除,把后面去掉。
5、back是返回字符串最后一个字符。
6、clear是清空字符串。
7、at是返回字符串指定位置的字符。
8、contain是判断是否包含某个字符串。
9、count是字符串统计。
10、replace字符串查找替换。
11、indexOf是查找某个字符串并返回其在整个字符串中的位置。
12、insert是在指定位置插入指定字符串,后面的字符顺位后移。
13、split是根据字符或位置分割字符串,返回的是两段分割后的字符串。
14、remove移除某个字符串。
15、reserve翻转字符串中字符次序。
16、toXXX是吧字符串转换为XXX类型,XXX是有限的,需要查阅手册。
17、QString::number(XXX),把各种类型的数值XXX转换为QString类型。

六 完整计算器的实现

计算器能够实现加减乘除的运算,按钮输入,显示框显示结果。可计算小数,并且能够复位,能显示输入的数字并删除错误的输入数字。

1 技术路径

1、首先声明并绑定槽并声明对应的槽处理函数。声明两个中间变量tem1和tem2,分别为QString类型和QStringList类型,前者存储输入的字符串类型的数字,后者存储前者。
2、在点击不同的数字按钮的时候,将对应的数字添加在tem1字符串尾部并在显示框中显示,使用QString的“+”运算符重载就可以办到。
3、当点击任何运算符号时候,将tem1保存在tem2的第一个位置(用insert),然后将对应的运算符保存在tem2的第二个位置上,然后清空tem1,同时展示清空后的显示框以便于第二个数字的输入。这之后再点击数字的话就是第二个数的输入了。对于小数点的处理等同于数字。
4、当点击“=”的时候,首先判断tem2中是否已经有一个数(QString格式)和一个运算符(还是QString格式)了,用tem2.count()来判断如果返回值是2,说明之前已经输入过运算符了,如果不是2,那就清空tem1和tem2然后清空显示框(等同于归零)。当tem2.count()的返回值是2的时候,先判断之前输入的是什么运算符(使用重载符号“==”),然后取出tem2中的第一个字符串并将其转换为浮点型数字格式(QString(XXX).toDouble()),然后取出tem1中的字符串也转换成浮点型数字格式,然后将两个转换出来的数字进行运算(我们之前已经判断这个是什么运算符了),然后将运算结果转换成QString格式并显示到显示框中。

2 改进路径

1、增加输入的合规性检验,并且在输入不合法时候报错并归零。
2、显示整个运算式,以便人们检查之前是否输入错误,并支持全局回删。

七 时间进度条

进度条是一种能够显著提高用户使用体验的部件。设计一个程序进度条,根据时间加载百分比。有两个按钮分别是开始和暂停。进度条达到满格后重头开始再次加载,直到按结束暂停。

1 技术路径

通用知识及问题解决

1 安装Qt后双击QtCreator图标后没任何反应

这个问题在百度上始终没有找到原因,别人发生的问题和这个都不一样,他们有的给出报错信息,有的能打开但是会卡死,唯独我的是没有任何反应,字面意思。后来查看在路径: /usr/share/applications/下的系统安装应用图标没找到QtCreator,在路径~/.local/share/applications/下倒是看到了Qt相关的图标,但是也没有解决问题的办法。后来在不卸载已安装的qt的情况下,直接在命令行输入命令:

sudo apt-get install qtcreator

安装好以后,在命令行输入qtcreator就能够打开qtcreator的界面,但是没有kit。此时在系统的软件界面中出现了几个新的qt相关图标,选择QtCreator的进行打开就可以了。然后就一切正常了。

2 安装Qt后Creator新建项目后不显示头文件夹、源文件夹、界面文件夹,相关文件也显示不出来,打开项目所在目录发现文件是有的,只是不显示。

解决办法:初步怀疑是因为编译器kit模块出现问题导致的。故在系统安装C/C++编译环境可解决问题。
在终端输入如下命令:

sudo apt-get install vim
sudo apt-get install cpp
sudo apt-get install build-essential

即可安装gcc、g+、make等编译器。重启Qt Creator并重新建立项目即可。

3 运行报错:cannot find -IGL

解决办法:终端运行命令:

sudo apt-get install libglu1-mesa-dev

在这里插入代码片`安装后即可。

4 代码重新编辑过,但是生成的可执行文件依旧是原来没有编辑的时候的样子

因为Qt是由C++封装的,其运行规则是。
当C++ code 被别的线程占用的时候,Qt code 的更改就没办法更新C++ code 了,就会导致更新了Qt code 最后的可执行程序却没有改变。
解决方法1就是全部保存,关闭项目,然后再打开运行即可更新C++代码和可执行文件效果。
解决方法2是对项目右键清除,然后再重新运行一遍即可。此法可能无效,但是方法1肯定奏效。
每次修改Qt代码后,清空项目再重新编译,是一种良好的风格。

5 Qt生成的文件包中缺少可执行文件

有很多原因会导致这个问题的发生,可以尝试一下办法解决:
解决方法1:将.pro文件中的代码:
TEMPLATE += lib(如果有的话)修改为TEMPLATE += app。这是因为后面是lib的生成的是配置文件.dll,而结尾是app的生成的才是可执行文件。
解决方法2:在.pro文件中加入一行代码:QMAKE_LFLAGS += -no-pie。此代码含义不明,但是可以解决问题,看官方文档说此代码是将通用标识集传递给连接器,对于特定项目使用专业变量,文档中没有进一步的解释和介绍了。
解决方法3:在文件夹中修改文件权限为可执行,然后再终端中命令运行。
我碰到的是第一种情况,运行后build的文件夹中,只存在和项目名称一样的shared library文件,没有可执行文件,使用方法2解决的。

6 在源文件或者头文件中,本该变成紫色的包名称没有变色,或者在编写代码的时候,本该自动弹出代码的地方没有自动弹出

忘记添加对应的头文件了,复制忘记添加的头文件名称,直接在源文件头部添加即可。

7 两个通用知识关于”箭头->”和按钮改名字

第一个,Qt中类的功能或者对象的功能代码展示用的箭头,但是我们不必如此输入,箭头输入起来太麻烦了,用”.”即可,一样能够弹出备选项或代码补全(除非不支持或者类没声明)。
第二个,Qt中最好在设计窗口显示的时候就把部件的名字给命名好,然后再右键转到槽,这个次序不可颠倒。如果先右键转到槽后改了部件名字,那就会出现按钮失灵的情况,这是因为槽绑定完按钮后,只认名字,名字改了就等于绑定了一个别的按钮。当然,可以通过手动修改的方法来解决这个问题,不过总归是比较麻烦,不如开始就把部件命名好名字。

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值