电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
一起学Qt之基础篇--------入门(上)
分 享
扫描二维码分享
一起学Qt之基础篇--------入门(上)
Qt
linux
交叉编译
大斯
关注
发布时间: 2020-03-31
丨
阅读: 734
# 前言 最近因为新的项目要做界面,所以开始接触Qt界面编程,发现Qt真真是太太太。。。好用了,我尤其是喜欢它的可视化开发工具qtcreate,非常直观的就能看到当前的界面是什么样子。而不用先下载到开发板上,麻烦!嘻嘻,我也是刚开始学习的,可能这篇文章不是很全面,有一起学习的小伙伴可以一起交流哦! ## Qt基础知识 ### 1. 信号与槽 废话不多说,我们先来看Qt里面最重要的一个机制--信号和槽。简单理解就是当你操作界面上的某个部件,比如按钮时,需要其他的窗口来响应或者是可以激活其他的操作,这个跳转的过程就应用了信号和槽的机制。连接方式可以是一对一、一对多、多对一,甚至是信号和信号连接。 - 信号 当某个信号对其所有者的内部状态发生改变时,信号被一个对象发射出去。注意:只有定义过这个信号的类和其派生出的类才能发射这个信号。信号声明在头文件中,使用的是关键字:**signals** - 槽 当与槽关联的信号被发射时,槽就会被调用。槽有权限,和C++内的定义一样,分别是:**public slots、protected slots、private slots** - 信号和槽的关联 信号和槽通过connect函数关联起来,定义如下: **QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)** 第一个参数是发送对象,第二个是信号,第三个是接收对象,第四个是槽函数。第五个是信号与槽的关联方式(有3种),大家可以在Qt的类库参考手册中查看。 ### 2. 对话框--QDialog类 对话框窗口属于顶层窗口,不能被嵌入到其他窗口中,它通常作为短期任务或者简单通信来使用,可以分为模式和非模式两种。这里简单解释一下,模式对话框就是运行时是老大,其他窗口都不准动。处理完这个对话框才能处理其他的;非模式就是大家都是普通人,你想先处理哪个都OK。 **这里插一句我的感悟:我是真的觉得Qt的精髓就是类的继承!!!** 从它的继承关系图可以看出QDialog继承于QWidget,同时又派生出了很多其他的对话框类,重点看一下常用的对话框。 ![](https://cf04.ickimg.com/bbsimages/202003/97478252dd03e51220e6f8e67f7d0da9.png) - 文件对话框 QFileDialog 用来选择一个或多个文件或者目录,通过**QFileDialog::getOpenFileName**函数打开一个文件对话框,它有4个参数,分别是指定对话框的父窗口部件、设置对话框标题、指定默认打开的目录路径、设置文件过滤器类型 - 颜色对话框 QColorDialog 用来选择颜色,通过**QColorDialog::getColor**函数获取颜色,它有3个参数,分别是设置初始颜色、指定父窗口、设置对话框标题 - 字体对话框 QFontDialog 用来选择/设置字体,通过**QFontDialog::getFont**函数获取选择的字体,它的参数是bool类型变量,用来存放按下的按钮状态 - 输入对话框 QInputDialog 进行简单的输入,比如一个数字。通过**QInputDialog::getText**函数提供一个可输入字符串的对话框。它有4个参数,分别是指定父窗口、设置窗口标题、设置对话框中的标签显示文本、设置输入字符串的显示模式 - 进度对话框 QProgressDialog 显示一个长时间操作的工作进度, - Qt消息框 QMessageBox QMessageBox::question 一个具有标题和文本框的询问消息框 QMessageBox::informaton 一个具有标题和文本框的提示消息框 QMessageBox::warning 一个具有标题和文本框的警告消息框 QMessageBox::about 一个具有标题和文本框的消息框 QMessageBox::aboutQt 一个显示关于Qt消息框 ### 3.主窗口 QMainWindow类 QMainWindow类提供了一个应用程序主窗口,包括一个菜单栏(M)、多个工具栏(T)、多个锚接部件(D)、一个状态栏(S)和一个中心部件(C)。界面布局如下图: ![](https://cf04.ickimg.com/bbsimages/202003/555b4c8fd831ffd0a683cf5e77307c9a.png) - 菜单栏 QMenuBar类提供了一个水平的菜单栏,在QMainWindow中可以直接获取默认的菜单栏,向其中添加QMenu类型的菜单对象,然后向弹出的菜单中添加QAction类型的动作对象作为菜单项。 - 工具栏 QToolBar工具栏类提供了一个包含一组控件,可以移动的面板。 - 中心部件 中心部件一般是编辑器或者浏览器。一般操作就是放置一个部件,然后使用布局管理器使其充满整个中心区域,且随窗口的大小变化而变化。可以是单文档部件,也可以是多文档部件。 - 锚接部件 锚接部件可以停靠在QMainWindow中,也可以悬浮起来作为桌面顶级窗口,还可以被关闭和隐藏起来。 - 状态栏 状态栏用来显示状态信息,主要有3类:临时信息、正常信息和永久信息 ### 4. 自定义窗口部件 QWidget类 QWidget类是所有用户界面对象类的基类,主要实现的功能是将窗口部件显示到屏幕上,以及处理用户的输入等基础的功能。窗口部件既可以作为单独的窗口显示,也可以嵌入到其他的部件之中。继承关系图大家可以看QDialog类那一节的。 #### - 基础的窗口部件类 **1. QAbstractButton**按钮控件,它的子类包括: QCheckBox:带文本标签的复选框 QPushButton:按钮 QRadioButton:带文本标签的单选按钮 QToolButton:快速存取按钮 **2. QAbstractSlider**,它的子类包括: QDial:圆形范围控制 QScrollBar:水平或者垂直进度条 QSlider:水平或垂直的滚动条 **3. QAbstractSlider**,它的子类包括: QDateTimeEdit:编辑日期和时间的部件 QDateEdit:继承自QDateTimeEdit类,编辑日期的部件 QDoubleSpinBox:Spin box,其中的值是double形 QSpinBox:Spin box,其中的值是整形,每次加1 **4. QFrame**,它的子类包括: QLabel:标签类 QToolBox:列标签控件条目 QSplitter:分裂器部件 QMenu:菜单,通常用于菜单栏 **5. 直接继承于QWidget的子类** QComboBox:列表条目输入框 QFontComboBox:让用户选择字体的组合框 QFontComboBox:焦点框 QLineEdit:文本编辑框 QCroupBox:带标题的组合框 #### - 复杂的窗口部件 **1. QCalendarWidget**:日历控件,允许用户选择日期 **2. QAbstractItemView**,它的子类包括:- QColumnView:模型/视图结构中实现列的视图 QListView:系统提供的列表视图 UndoView:一个QListView的派生类 QTableView:表视图 QTreeView:树形视图 QWebView:查看和编辑web文档 #### - 抽象类 QFrame:所有的带框架窗口部件的基类 QAbstractSpinBox:滚轮和线编辑的抽象类 QAbstractButton:按钮类的抽象类 QAbstractScrollArea:与滚动条相关的类 QAbstractSlider:显示一定范围内的值 ### 5. 部件布局 #### - 布局管理器 布局管理器是Qt界面程序开发中管理窗口子部件最合适的方法,常见的布局管理器有: 水平布局管理器QHboxLayout,用于水平方向上组织管理窗口子部件 垂直布局管理器QVboxLayout,用于垂直方向上组织管理窗口子部件 网格布局管理器QGridLayout,按二维的网格的形式组织管路窗口子部件 #### - 分裂器部件 QSplitter QSplitter通过分裂将窗口分裂成两个字窗口,并且可以通过拖动分裂柄来改变子窗口的大小,分裂器部件中也可以添加其他的窗口部件。 #### - 栈部件 QStackedWidget QStackedWidget提供了一个栈空间,用来管理窗口部件,但是某一时刻,栈空间中只能有一个窗口部件被显示 #### - 工作空间 QWorkSpace QWorkSpace提供了可以包含窗口部件的工作区窗口 ## Qt练习例程 接下开我们通过一个小例程来练习一下上面的知识,运行结果类似QQ的个人信息界面 ![](https://cf04.ickimg.com/bbsimages/202003/8a52572f3a2476057c9e94123d98fd9d.png) 好的,首先我们打开QCreator,先创建一个工程,点击new project ![](https://cf04.ickimg.com/bbsimages/202003/376588ba6716666b5dc0dd60ea4b8299.png) ![](https://cf04.ickimg.com/bbsimages/202003/741ff39f29a9fb7607ba9c618ca83040.png) ![](https://cf04.ickimg.com/bbsimages/202003/0c5aeaaf64eb8682efb1d7a0f507d35f.png) 生成了一个工程后,我们就可以在里面添加我们需要的代码了,看一下我们的程序包含关系图,能更清楚的了解程序的结构。 ![](https://cf04.ickimg.com/bbsimages/202003/b97c136984c2379f14c5417c49a8c09a.png) 其中,BaseInfo类和MoreInfo类都是我们新建的类,具体的代码请大家移步**下一节**!!!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
大斯
关注
评论
(1)
登录后可评论,请
登录
或
注册
神马姐
17
天前...
学习了
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交