本章主要内容如下:
- 1) 窗口组件(QWidget)
- 2) QT坐标系统
- 3) 消息处理(信号与槽)
介绍
- Qt以组件对象的方式构建图形用户界面
- Qt中没有父组件的顶级组件,则被叫做窗口
- 组件的类型分为:
- 容器类(父组件) : 用于包含功能的界面组件
- 功能类(子组件) : 用于实现特定的交互功能
如下图所示:
比如上面的QgroupBox ,即属于顶级组件的功能类(子组件),又是3个功能类组件的父组件(容器)
组件继承
Qt中所有窗口组件都继承于QWidget类,而QWidget类又继承于QObject类和QPaintDevice类.
如下图所示(只举例了3个窗口组件类):
(因为子类可以初始化父类)
- QWidget类对象常作为父组件或顶级组件使用
<span "="" src="https://images2018.cnblogs.com/blog/1182576/201804/1182576-20180418161544015-482903249.png">
2)生成QWidget模板
运行模板:
可以看到生成了一个窗口,然后我们来看看模板代码,是如何生成的.
3)模板代码如下所示
根据之前讲的内容可以发现,由于上面的QWidget w对象没有父组件,所以QWidget w便成为了没有父组件的顶级组件,从而生成了窗口.
介绍
- Qt使用统一的坐标系统定位窗口部件的位置和大小
- QWidget类为组件类提供了窗口部件所需的坐标系统成员函数
在Qt里,坐标类型分为
- 顶级窗口部件的定位
- 窗口内部件的定位
- 窗口部件的大小设置
坐标位置示意图,如下所示
QWidget类提供的常用坐标系统成员函数有:
- resize() : 设置窗口内部的宽高( width()和height()值)
- move() : 设置整个窗口的x,y坐标( x()和y()值)
- setGeometry() : 设置窗口内部的x,y,w,h(不包括标题和窗口边框)
- size() : 获取窗口部件的大小
- pos() : 获取窗口部件的位置
- x() : 获取整个窗口x坐标
- y() : 获取整个窗口y坐标
- width() : 获取窗口内部的宽度(不包括外边框的宽度)
- height() : 获取窗口内部的高度(不包括窗口标题栏的高度)
- const QRect& geometry () : 获取窗口内部的x,y,w,h(不包括标题和窗口边框)
- const QRect& framgeometry () : 获取整个窗口的x,y,w,h
可以参考下图所示
注意: 在代码里,执行show()后, 再获取 x,y,w,h坐标 才有效
窗内坐标(x,y)永远比窗外坐标大,窗外大小(w,h)永远比窗内大小大
<span "="" src="https://images2018.cnblogs.com/blog/1182576/201804/1182576-20180418161805084-1785084822.png">
<span "="" src="https://images2018.cnblogs.com/blog/1182576/201804/1182576-20180418161813765-1754445609.png">
connect()函数原型
在信号与槽里,Qt引进了几个新的关键字:
- SIGNAL :指定消息名(信号),用于connect()函数里
- SLOT : 指定消息处理函数名(槽),用于connect()函数里
- Q_OBJECT : 指定该类拥有槽(消息处理),托福和雅思在类声明的内部开始处加上Q_OBJECT即可
- slots : 用于在类中声明消息处理函数,比如:
其中上面的quit() 和clicked()都是系统预定义好的,接下来我们自定义槽
首先需要注意
- 类中声明槽(处理信号的成员函数)时,需要slots声明
- 槽和信号的函数参数必须一致,比如clicked()和quit()都是无参数的
- SIGNAL和SLOT指定的函数(信号和槽)只能包含参数类型,不能包含参数名
开始试验,通过不同按钮点击,来打印不同的信息
写QButtonDebug.h:
写QButtonDebug.cpp:
写main.cpp
运行测试
如下图所示,可以看到通过点击不同的按钮,便能打印不同的信息出来
介绍
- 只有Qt类才能定义信号,且该类必须在头文件中声明
- 信号函数只能通过signals关键字进行声明,不能定义,且返回值必须是void类型
- 信号函数的属性会被自动设置为protected类型
- 发送信号时,只需要通过emit关键字调用信号函数即可
- 如果信号函数的参数多于槽函数时,多于的参数将被忽略
- 槽函数的返回值必须是void类型,且可以被其它普通成员函数调用
自定义信号示例:
自定义槽函数示例:
信号与槽的组合
- 信号函数可以连接多个槽函数
- 多个信号函数可以连接一个槽函数
- 一个信号就可以连接到另一个信号
- 通过connect函数进行连接,也可以通过disconnect函数取消连接
示例1-多个信号连接一个槽:
打印:
示例2-信号1连接信号2,信号2连接槽:
打印: