zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    TestNG:org.openqa.selenium.firefox.NotConnectedException: Unable to connect
    Python 程序员经常犯的 10 个错误
    python爬虫框架scrapy实例详解
    使用python进行汉语分词
    Python监控日志程序
    用Python读取excel中的数据
    Python 文件处理
    10 款最好的 Python IDE
    自动化测试代码架构浅谈
    Robotium如何向下拖动屏幕
  • 原文地址:https://www.cnblogs.com/xiongjim/p/9673938.html
Copyright © 2011-2022 走看看