新建项目
打开Qt Creator 界面后点击左上角的 文件 选择 new project
选择项目模板
项目模板 | 说明 |
---|---|
Application | Qt应用程序,包括普通窗体程序和QtQuick程序 |
Libary | 可以创建动态库、静态库以及Qt Quick 扩展插件、QtCreator 自身插件 |
其他项目 | 可以创建单元测试项目、Qt4设计师自定义控件、子目录项目等 |
Non-Qt-Project | 非Qt项目。可以创建纯C或C++项目 |
import Project | 导入项目。从版本控制系统管理的软件项目导入旧的项目 |
常用的是第一类,选中后,在右侧会显示出Qt应用程序的五个子模版:
选择了不同的项目模板,Qt Creator 就会在项目创建完毕以后生成不同的基础代码
注意创建路径名称不能有中文!!!
选择构建系统
使用默认的qmake即可
Qt中的构建工具有三种可供选择,分别是: qmake、CMake、 Qbs,下面依次介绍。
Qt官方声明,因市场原因,弃用Qbs。对于Qt用户来说,qmake是当前使用最广泛的构建工具,CMake其次。
填写类信息设置界面
对于基类的选择,目前有三种基类
基类 | 说明 |
---|---|
QMainWindow | 主窗口类,一般用于较为复杂的应用程序,除了中央客户区界面,还包括菜单栏、工具栏、状态栏以及多个可停靠的工具对话框等 |
QWidget | 最简单、最基本的窗体程序,里面可以放置多个控件实现程序功能. |
QDialog | 基于对话框的程序,对话框一般用于弹窗, 也可以用于主界面显示。对话框是从QWidget继承而来的,并丰富了一些能,如模态显示和返回值等 |
选择语言和翻译文件
这里的语言不是编程语言,而是例如“中文” “英文” 这种语言
由于暂时不需要考虑国际化问题,直接点击下一步即可
选择 Qt 套件
Qt套件是指Qt程序从编译链接到运行环境的全部工具和Qt类库的集合,对于MinGW版本Qt程序生成和调试,至少需要MinGW中的编译器g++ (自 动调用链接器)、g++ 配套的基础库、调试器gdb还有使用MinGW环境编译而成的Qt类库自身。默认情况下,在上面Kit Selection里选中全部套件。
选择版本控制系统
项目构建完成
点击左下角运行按钮,或者按CTRL+R,查看效果
main.cpp 文件解析
QApplication 为应用程序类;代码中 QApplication a ,a 为应用程序对象,有且仅有一个;
Widget 为刚才创建项目的时候,所选的类名
a.exec() :程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给Qt, Qt 完
成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec() 中,Qt接受并处理用户
和系统的事件并且把它们传递给适当的窗口部件。
widget.cpp 文件解析
widget.ui 文件解析
点击form file 中的 ui 文件,打开图形编辑界面
该格式为XML格式,和HTML格式类似
Qt 中使用XML文件去描述程序的界面,进一步会结合qmake 调用相关的工具,依据XML文件生成C++代码,从而把完整的界面构造出来
.pro 文件解析
如果编译运行Qt项目,构建过程中还会生成一些中间文件,如下图,打开资源管理器查看
打开后,返回上一级会看到多出来一个build-xxx文件夹,这个文件夹里面就是项目在运行过程中生成的一些临时文件
利用 Qt 创建一个Hello World 程序有两种方式。分别是图形化的方式和纯代码的方式。
图形化方式
图形化方式比较简单,打开 ui 界面,然后找到 Label标签 拖动到编辑界面,然后输入文字即可。
运行程序,查看效果。
在 Qt Designer 的右边可以查看有哪些控件,label 实际上就是一个界面上用来显示字符串的控件
在编辑界面可以看到XML文件中多了一段代码,qmake就会在编译项目的时候,基于这个内容生成一段C++代码,构建出界面内容。
纯代码方式创建Hello World 程序
一般通过代码来构造界面的时候,通常会把构造界面的代码放到 Widget 的构造函数中
代码如下,记得包含头文件
运行查看效果
Hello World 程序创建完成。但是文字默认在左上角,通过纯代码的方式也可以修改,后面会讲。
在这段代码中,在 new 了一个对象之后,却没有 delete ,会不会造成内存泄漏?
答案是在 Qt 中不会造成内存泄漏。此处通过 new 的方式创建对象,就是为了把该对象的生命周期交给 Qt 的对象树统一管理。代码中的 label 对象会在合适的时机被析构释放,这个合适的时机是指在窗口关闭的时候。
Qt 中的对象树,是一颗 N叉树 ,通过该树把界面上的各种元素组织起来。
比如有如下几种元素。
经过对象树组织后,就变成下图所示
使用对象树组织起来,最主要的目的,就是为了在合适的时机,也就是窗口关闭的时候,把这些对象统一释放。
QLabel *label = new QLabel(this);
代码中传入this 参数是为了将该对象挂在对象树上。通过 new 的方式在堆上建立对象,交给对象树管理。
而之前说的下面这种方式,是不推荐的
QLabel label(this);
这种在栈上创建的方式,可能存在“提前释放”的问题。运行查看效果。
窗口中没有设定好的 label 控件,因为被提前释放掉了。
qDebug() 的使用效果和 std::cout << std::endl 的效果一样,但是比后者好。
原因是 qDebug() 会自动处理编码方式,在 Qt 中如果用 cout 打印文字日志,可能会出现乱码,因为编码不同。
比如在析构函数中加入打印语句。
运行后,然后关闭窗口,自动调用析构函数,查看应用程序输出,会看到乱码
所以通常采用 qDebug() 的方式去打印日志。
qDebug() 还有一个优点就是可以统一打开和关闭,就能方便程序员调试。
在 .pro 文件加入这条代码即可
DEFINES += QT_NO_DEBUG_OUTPUT
除了上面使用 label 标签的形式,还可以采用编辑框和按钮的方式。同样分为图形化界面方式和纯代码方式完成。
编辑框图形化方式
如下图所示,编辑框分为单行编辑框和多行编辑框,这里选择单行编辑框即可。拖动到编辑界面,然后输入文字。
运行查看效果。编辑框的内容运行后可以自己修改。
编辑框纯代码方式
纯代码方式和之前介绍过的大同小异。首先需要创建一个 QLineEdit 对象,然后设置文字。
运行查看效果。
按钮图形化方式
在 ui 界面找到 Push Button 然后拖动到图形化编辑界面输入文字
运行查看效果
这个按钮是可以点击的,但是点击了没有反应。如果想要点击了有反应,需要用到信号和槽机制,后面会讲。这里先简单说一下,本质就是给按钮的点击操作,关联一个处理函数,当用户点击的时候,就会执行这个处理函数。
这里需要用到 connect 函数
代码如图所示:
void Widget::handClick()
{
if(ui->pushButton->text() == QString("Hello World!"))
{
ui->pushButton->setText("Hello Qt!");
}
else
{
ui->pushButton->setText("Hello World!");
}
}
记得先在头文件声明该函数。声明以后,快速生成函数定义快捷键:alt + 回车
会自动在 .cpp 文件帮我们处理好一些代码
文本内容改变了,再点击一次
点击一次按钮就会在两个文本内容之间来回切换,成功实现我们想要的功能。
纯代码方式实现按钮版 Hello World 程序
纯代码方式实现,首先需要我们自己 new 一个 button 对象,为了能让其他成员函数能够访问该变量,需要将该对象定义为成员变量。
实际开发以纯代码为主还是图形化界面为主?
这两者都很重要,难分主次。如果当前程序界面,界面内容是比较固定的,此时就会以图形化界面的方式来构造界面。如果当前界面,经常要动态变化,此时就会以代码的方式来构造界面。这两种方式,哪种方便就用哪种,而且这两种方式可以配合使用。
命名规范
快捷键
使用帮助文档
打开文档一共有三种方法
坐标体系:以左上角为原点(0,0),X向右增加,Y向下增加
对于嵌套窗口,其坐标是相对于父窗口来说的。
比如图中 QPushButton 的父窗口就是 QWidget,原点就是QWidget 左上角。QWidget没有父元素,相当于父元素就是整个显示器,原点就是显示器左上角。
上面我们提到过,以纯代码的方式创建一个这样一个程序,按钮会默认在左上角,也就是原点(0,0)处,这里的位置是可以改变的。
需要用到 move 函数
把这个按钮相对于原点水平移动200像素,垂直移动300像素,效果如下
还可以设置窗口弹出时的位置。设置为弹出为显示器的原点处
查看效果,在窗口弹出后位置在显示器左上角。
以上是关于 Qt 的一些基础操作,下篇文章是关于 Qt 的信号和槽机制。