2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)

Posted xiongjim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)相关的知识,希望对你有一定的参考价值。

本章主要内容如下:

  • 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连接槽:

打印:

 

 

 

 

 

  


文章来源:https://www.cnblogs.com/lifexy/p/8876016.html

以上是关于2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)的主要内容,如果未能解决你的问题,请参考以下文章

QT之坐标系统

007_Qt 中的坐标系统

QWidget居中显示(qt窗口坐标原点是在”左上角”的,有图)

Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ign

QT基本使用说明

Qt学习之路2---窗口组件及窗口类型