[Qt][QWidget]详细讲解


1.概述

  • Widget是Qt中的核⼼概念,译为控件
  • Qt的API设计⻛格是⾮常清晰的,控件中的属性都是可以获取和设置的
    • 例如text()获取按钮⽂本,使⽤setText()设置⽂本

2.QWidget核心属性

1.简介

  • 在Qt中,使⽤QWidget类表⽰"控件"
    • 像按钮、视图、输⼊框、滚动条等具体的控件类,都是继承⾃QWidget
    • 可以说,QWidget中就包含了Qt整个控件体系中通用的部分

2.核心属性概览

  • enabled:设置控件是否可使⽤true/false
  • geometry位置和尺⼨,包含x, y, width, height四个部分
    • 其中坐标是以⽗元素为参考进⾏设置的
  • windowTitle:设置widget标题
  • windowIcon:设置widget图标
  • windowOpacity:设置widget透明度
  • cursor⿏标悬停时显⽰的图标形状
    • 是普通箭头,还是沙漏,还是⼗字等形状
  • font字体相关属性
    • 涉及到字体家族,字体⼤⼩,粗体,斜体,下划线等等样式
  • toolTip:⿏标悬停在widget上会在状态栏中显⽰的提⽰信息
  • toolTipDuringtoolTip显⽰的持续时间
  • statusTipwidget状态发⽣改变时显⽰的提⽰信息
    • ⽐如按钮被按下等
  • whatsThis:⿏标悬停并按下alt+F1时,显⽰的帮助信息(显⽰在⼀个弹出的窗⼝中)
  • styleSheet:允许使⽤CSS来设置widget中的样式
    • Qt中⽀持的样式⾮常丰富,对于前端开发⼈员上⼿是⾮常友好的
  • focusPolicy:该widget如何获取到焦点
    • Qt::NoFocus:控件不参与焦点管理,即⽆法通过键盘或⿏标获取焦点
    • Qt::TabFocus:控件可以通过Tab键获得焦点
    • Qt::ClickFocus:控件可以通过⿏标点击获得焦点
    • Qt::StrongFocus:控件可以通过键盘和⿏标获得焦点
    • Qt::WheelFocus:控件可以通过⿏标滚轮获得焦点(在某些平台或样式中可能不可⽤)
  • contextMenuPolicy上下⽂菜单的显⽰策略
    • Qt::DefaultContextMenu:默认的上下⽂菜单策略,⽤⼾可以通过⿏标右键或键盘快捷键触发上下⽂菜单
    • Qt::NoContextMenu:禁⽤上下⽂菜单,即使⽤⼾点击⿏标右键也不会显⽰菜单
    • Qt::PreventContextMenu:防⽌控件显⽰上下⽂菜单,即使⽤⼾点击⿏标右键也不会显⽰菜单
    • Qt::ActionsContextMenu:将上下⽂菜单替换为控件的“动作”菜单,⽤⼾可以通过⿏标右键或键盘快捷键触发这个菜单
    • Qt::CustomContextMenu:使⽤⾃定义的上下⽂菜单,⽤⼾可以通过⿏标右键或键盘快捷键触发这个菜单
  • locale设置语⾔和国家地区
  • acceptDrops该部件是否接受拖放操作
    • 如果设置为true,那么该部件就可以接收来⾃其他部件的拖放操作
      • 当⼀个部件被拖放到该部件上时,该部件会接收到相应的拖放事件(如dropEvent)
    • 如果设置为false,那么该部件将不会接收任何拖放操作
  • minimumSize:控件的最⼩尺⼨,包含最⼩宽度和最⼩⾼度
  • maximumSize:控件的最⼤尺⼨,包含最⼤宽度和最⼤⾼度
  • sizePolicy尺⼨策略,设置控件在布局管理器中的缩放⽅式
  • windowModality:指定窗⼝是否具有"模态"⾏为
  • sizeIncrement拖动窗⼝⼤⼩时的增量单位
  • baseSize窗⼝的基础⼤⼩
    • ⽤来搭配sizeIncrement调整组件尺⼨使计算组件应该调整到的合适的值
  • palette调⾊板,可以设置widget的颜⾊⻛格
  • mouseTracking是否要跟踪⿏标移动事件
    • 如果设为true,表⽰需要跟踪,则⿏标划过的时候该widget就能持续收到⿏标移动事件
    • 如果设为false,表⽰不需要跟踪,则⿏标划过的时候widget不会收到⿏标移动事件,只能收到⿏标按下或者释放的事件
  • tabletTracking:是否跟踪触摸屏的移动事件
    • 类似于mouseTracking,Qt5.9中引⼊的新属性
  • layoutDirection布局⽅向
    • Qt::LeftToRight:⽂本从左到右排列,也是默认值
    • Qt::RightToLeft:⽂本从右到左排列
    • Qt::GlobalAtomics:部件的布局⽅向由全局原⼦性决定(其实就是根据应⽤程序中的其他widget布局⽅向确定的)
  • autoFillBackground:是否⾃动填充背景颜⾊
  • windowFilePath:能够把widget和⼀个本地⽂件路径关联起来
    • 其实作⽤不⼤
  • accessibleName设置widget的可访问名称,这个名称可以被辅助技术(像屏幕阅读器)获取到
    • 这个属性⽤于实现⽆障碍程序的场景中(也就是给盲⼈写的程序)
  • accessibleDescription设置widget的详细描述,作⽤同accessibleName
  • inputMethodHints针对输⼊框有效,⽤来提⽰⽤⼾当前能输⼊的合法数据的格式
    • ⽐如只能输⼊数字,只能输⼊⽇期等

3.QWidget常用属性

1.enabled

  • 接口说明
    • isEnabled():获取到控件的可⽤状态
    • setEnabled():设置控件是否可使⽤,true/false
  • 禁⽤:该控件不能接收任何⽤⼾的输⼊事件,并且外观上往往是灰⾊的
    • 如果⼀个widget被禁⽤,则该widget的⼦元素也被禁⽤

2.geometry

1.是什么?

  • 位置和尺⼨,其实是四个属性的统称

    • x, y:横纵坐标
    • width:宽度
    • height:高度
      请添加图片描述
  • 实际开发中,并不会直接使⽤这⼏个属性,⽽是通过⼀系列封装的⽅法来获取/修改

    • geometry():获取到控件的位置和尺⼨,返回结果是⼀个QRect
      • 包含了x, y, width, height,其中x, y是左上⻆的坐标
    • setGeometry(QRect) && setGeometry(int x, int y, int width, int height)
      • 设置控件的位置和尺⼨,可以直接设置⼀个QRect,也可以分四个属性单独设置

2.Window Frame的影响

  • 如果widget作为⼀个窗⼝(带有标题栏、最⼩化、最⼤化、关闭按钮),那么在计算尺⼨和坐标的时候就有两种算法
    • 按照包含Window Frame计算:x(), y(), frameGeometry(), pos(), move()
    • 按照不包含Window Frame计算:geometry(), width(), height(), rect(), size()
      请添加图片描述

3.相关API

  • x():获取横坐标
    • 计算时包含Window Frame
  • y():获取纵坐标
    • 计算时包含Window Frame
  • pos():返回QPoint对象,⾥⾯包含x(), y(), setX(), setY()等⽅法
    • 计算时包含Window Frame
  • frameSize():返回QSize对象,⾥⾯包含width(), height(), setWidth(), setHeight()等⽅法
    • 计算时包含Window Frame
  • frameGeometry():返回QRect对象,QRect相当于QPointQSize的结合体,可以获取x, y, width, size
    • 计算时包含Window Frame
  • width():获取宽度
    • 计算时不包含Window Frame
  • height():获取高度
    • 计算时不包含Window Frame
  • size():返回QSize对象,⾥⾯包含width(), height(), setWidth(), setHeight()等⽅法
    • 计算时不包含Window Frame
  • rect():返回QRect对象
    • 计算时不包含Window Frame
  • geometry():返回QRect对象
  • setGeometry():直接设置窗⼝的位置和尺⼨,可以设置x, y, width, height或者QRect对象`
  • 上述API中,有frameGeometrygeometry就足够完成所有需求了,为什么还要提供这么多功能重复的API呢?
    • Qt API设计理念:尽量符合人的直觉

4.注意

  • 在构造函数中,Widget对象正在构造,还没有加⼊到对象树中,此时不具备Window frame
  • 当对象树已经构造好了,此时Widget已经具备了 Windowframe,此时geometry()frameGeometry()在位置和尺⼨上均出现了差异

3.windowTitile

  • 相关接口
    • windowTitle():获取到控件的窗口标题
    • setWindowTitle(const QString& title):设置控件的窗⼝标题
  • 注意:上述设置操作针对不同的widget可能会有不同的⾏为
    • 如果是顶层widget(独⽴窗⼝),这个操作才会有效
    • 如果是widget,这个操作⽆任何效果

4.windowIcon

  • 相关接口
    • windowIcon():获取到控件的窗⼝图标,返回QIcon对象
    • setWindowIcon(const QIcon& icon):设置控件的窗⼝图标
  • 注意:同windowTitle,上述操作仅针对顶层widget有效
  • QRC机制
    • 解决两个问题,使程序员更方便的来管理项目依赖的静态资源
      • 确保文件所在的路径在目标用户机器上存在
      • 确保文件不会被用户搞没了
    • 如何操作?
      • 将资源⽂件添加到项⽬中来⽅便地访问和管理这些资源
        • 这些资源⽂件可以位于qrc⽂件所在⽬录的同级或其⼦⽬录下
      • 给Qt项目引入一个额外的XML文件(后缀名使用.qrc)
        • 在这个XML记录要使用的资源文件
      • Qt在编译项目的时候,就会根据qrc中描述的文件信息,把资源⽂件的⼆进制数据转成cpp代码,编译到exe中,从⽽使依赖的资源变得"路径⽆关"
    • QRC路径访问规则?
      • 使⽤:作为开头,表⽰从qrc中读取资源
      • /是在.qrc中配置的前缀(可自行配置)
      • file:资源的名称
      • 示例QIcon icon(":/SnowK.jpg");
    • 优点:确保了图⽚,字体,声⾳等资源能够真正做到"⽬录⽆关",⽆论如何都不会出现资源丢失的情况
    • 缺点:不适合管理体积⼤的资源
      • 如果资源⽐较⼤(⽐如是⼏个MB的⽂件),或者资源特别多,⽣成的最终的exe体积就会⽐较⼤,程序运⾏消耗的内存也会增⼤,程序编译的时间也会显著增加

5.windowOpacity

  • 相关接口
    • windowOpacity():获取到控件的不透明数值
      • 返回float,取值为0.0 -> 1.0,其中0.0表⽰全透明,1.0表⽰完全不透明
    • setWindowOpacity(float n):设置控件的不透明度

6.cursor

  • 相关接口
    • cursor():获取到当前widgetcursor属性,返回QCursor对象
      • 当⿏标悬停在该widget上时,就会显⽰出对应的形状
    • setCursor(const QCursor& cursor):设置widget光标的形状
      • 仅在⿏标停留在该widget上时⽣效
    • QGuiApplication::setOverrideCursor(co nst QCursor&cursor):设置全局光标的形状
      • 对整个程序中的所有widget都会⽣效,覆盖上⾯的setCursor()设置的内容
  • 系统内置光标
    enum CursorShape 
    {
            ArrowCursor,
            UpArrowCursor,
            CrossCursor,
            WaitCursor,
            IBeamCursor,
            SizeVerCursor,
            SizeHorCursor,
            SizeBDiagCursor,
            SizeFDiagCursor,
            SizeAllCursor,
            BlankCursor,
            SplitVCursor,
            SplitHCursor,
            PointingHandCursor,
            ForbiddenCursor,
            WhatsThisCursor,
            BusyCursor,
            OpenHandCursor,
            ClosedHandCursor,
            DragCopyCursor,
            DragMoveCursor,
            DragLinkCursor,
            LastCursor = DragLinkCursor,
            BitmapCursor = 24,
            CustomCursor = 25
    };
    
  • 自定义鼠标光标
    // 创建一个位图对象,加载自定义光标图片
    QPixmap pixmap(":/SnowK.jpg");
    
    // 缩放图片为64*64的尺寸
    pixmap = pixmap.scaled(64, 64);
    
    // 创建QCursor对象,并指定"热点"为(2, 2)坐标位置
    // 所谓"热点"就是鼠标点击时生效的位置
    QCursor cursor(pixmap, 2, 2);
    
    // 设置光标
    this->setCursor(cursor);
    

8.font

  • 相关接口
    • font():获取当前widget的字体信息,返回QFont对象
    • setFont(const QFont& font):设置当前widget的字体信息
  • 关于QFont属性及其说明
    • family字体家族
      • ⽐如"楷体"、“宋体”、"微软雅⿊"等
    • pointSize:字体⼤⼩
    • weight:字体粗细
      • 以数值⽅式表⽰粗细程度取值范围为[0,99],数值越⼤,越粗
    • boid:是否加粗
      • 设置为true,相当于weight为75
      • 设置为false,相当于weight为50
    • italic:是否倾斜
    • underline:是否带有下划线
    • strikeOut:是否带有删除线

9.toolTip

  • 相关接口
    • setToolTip():设置toolTip
      • ⿏标悬停在该widget上时会有提⽰说明
    • setToolTipDuring():设置toolTip提⽰的时间,单位ms
      • 时间到后toolTip⾃动消失

10.focusPolicy

  • 作用:设置控件获取到焦点的策略
    • 例如:某个控件能否⽤⿏标选中或者能否通过tab键选中
  • 焦点:能选中这个元素,接下来的操作(⽐如键盘操作),就都是针对该焦点元素进⾏的
    • 这个对于输⼊框、单选框、复选框等控件⾮常有⽤的
  • 相关接口
    • focusPolicy():获取该widgetfocusPolicy,返回Qt::FocusPolicy
    • setFocusPolicy(Qt::FocusPolicy policy):设置widgetfocusPolicy
  • Qt::FocusPolicy是一个枚举类型
    • Qt::NoFocus:控件不会接收键盘焦点
    • Qt::TabFocus:控件可以通过Tab键接收焦点
    • Qt::ClickFocus:控件在⿏标点击时接收焦点
    • Qt::StrongFocus:控件可以通过Tab键和⿏标点击接收焦点(默认值)
    • Qt::WheelFocus:类似于Qt::StrongFocus同时控件也通过⿏标滚轮获取到焦点

11.styleSheet

  • 功能描述:通过CSS设置widget的样式
    • 样式:包括不限于⼤⼩、位置、颜⾊、间距、字体、背景、边框等
  • CSS(Cascading Style Sheets 层叠样式表):属于⽹⻚前端技术,主要⽤来描述界⾯的样式
    • 基于CSS中的样式属性Qt只能⽀持其中⼀部分,称为QSS(QtStyleSheet)
    • 具体的⽀持情况可以参考Qt⽂档中"QtStyleSheetsReference"章节
  • 使用示例:语法格式同CSS,使⽤键值对的⽅式设置样式
    • 键和值之间使⽤:分割
    • 键值对之间使用;分割
     ui->textEdit->setStyleSheet("background-color: #333; color: #fff;");
     ui->pushButton_light->setStyleSheet("color: #fff");
     ui->pushButton_dark->setStyleSheet("color: #fff");
    
  • 计算机中的颜色表示
    • 计算机中使⽤"像素"表⽰屏幕上的⼀个基本单位(也就是⼀个发亮的光点)
    • 每个光点都使⽤三个字节表⽰颜⾊,RGB各⼀个字节表⽰(取值范围是0-255)
    • 混合三种不同颜⾊的数值⽐例,就能搭配出千千万万的颜⾊出来
  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Qt5是一款跨平台的应用程序框架,适用于Windows、Linux、macOS和Android等多种操作系统。提供了诸如GUI、网络、数据库、XML、音频、视频等多个领域的丰富功能,因此成为开发人员常用的工具之一。 如何学习Qt5呢?首先,需要掌握C++编程语言,对于没有基础的人来说,需要先学习C++基础语法。其次,需要安装并配置好Qt5开发环境,包括Qt Creator IDE和Qt Framework等。安装完成后,就可以开始进行Qt5的编程学习了。 Qt5入门教程主要内容包括:Qt5的基本概念和常用组件, Qt对象模型和信号槽机制,界面设计和布局,窗口管理和事件处理等方面。在实践中,可以通过编写一些小型的应用程序来巩固所学内容。例如实现一个简单的文本编辑器、图像浏览器,模拟一个简单的计算器等。 在学习过程中,需要注意一些常见的问题。例如,Qt对象的生命周期、信号槽的连接方式、事件处理的优先级等都需要注意。另外,Qt5的文档和示例非常丰富,开发者可以通过查阅官方文档和代码示例来更好地理解Qt5的使用方法和特点。 总之,Qt5是一款功能强大的开发框架,适合从事图形界面开发、嵌入式开发、游戏开发等多个领域。学习Qt5需要掌握C++编程语言、熟悉Qt5的各种组件和特性,并进行实践。通过不断的学习和实践,开发者可以在Qt5框架下开发出高质量的应用程序。 ### 回答2: Qt是一种跨平台的C++应用程序开发框架。Qt5提供了许多新的特性和改进,如QML、Qt Quick、Qt Quick Controls和Qt WebEngine等。对于新手Qt5入门教程非常重要,因为它可以帮助他们快速上手并深入了解框架。 Qt5入门教程详细讲解版应该包括以下内容: 1.安装和设置Qt5:介绍不同平台上的安装步骤和必需的设置。 2.基本概念:介绍概念,如信号和槽、对象型、元对象系统和Qt应用程序的生命周期等。 3.第一个Qt5应用程序:创建一个Hello World应用程序并解释基本的代码架构。介绍Qt Creator集成开发环境的使用步骤。 4.Qt5界面设计:介绍QML、Qt Quick和Qt Quick Controls,这些特性可用于创建现代和响应式的应用程序界面。 5.数据持久性:介绍如何使用Qt5框架中的SQLite、MySQL和PostgreSQL等来实现数据持久性。 6.QWidget和QMainWindow:将介绍如何使用QWidget和QMainWindow类来创建桌面应用程序界面,添加菜单和栏,应用程序状态栏和工具栏。 7.调试和部署:说明如何调试和部署Qt应用程序。 总之,Qt5入门教程详细讲解版旨在帮助新手更好地了解Qt5框架并开始创建跨平台的应用程序。 ### 回答3: Qt5是一款流行的开源跨平台应用程序开发框架,用于构建桌面,移动和嵌入式应用程序。它支持多种编程语言,例如C ++,Python和JavaScript。本教程将详细讲解如何使用Qt5开始开发应用程序。 Qt5入门教程以C++语言为基础进行讲解,首先阐述了Qt5的工作原理和基本架构。之后,教程介绍了如何建立一个Qt5应用程序开发环境,并详细阐述了Qt Creator的功能和用法。接着,通过一个简单的“Hello World”应用程序示例,该教程介绍了Qt5的界面设计和常用控件的使用方式。 在基础知识介绍之后,本教程深入探讨了Qt5的核心构件,例如Qt Widgets,Qt Quick和Qt WebEngine。通过这些构件的讲解,学习者将会掌握如何在Qt5中创建各种用户界面。 本教程还包括有关处理Qt5信号和槽机制、自定义控件以及在Qt5应用程序中使用外部库的介绍。此外,教程详细讲解了如何调试和部署Qt5应用程序,并介绍了Qt5的一些高级功能,例如Qt Multimedia和Qt OpenGL。 总的来说,本教程非常详细,包含丰富的示例和练习,可以帮助初学者快速上手使用Qt5来开发各种类型的应用程序。无论您是想学习Qt5的初学者,还是有经验的开发人员,该教程都不容错过。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值