[Qt][QWidget]详细讲解

news2024/9/23 19:27:21

目录

  • 1.概述
  • 2.QWidget核心属性
    • 1.简介
    • 2.核心属性概览
  • 3.QWidget常用属性
    • 1.enabled
    • 2.geometry
      • 1.是什么?
      • 2.Window Frame的影响
      • 3.相关API
      • 4.注意
    • 3.windowTitile
    • 4.windowIcon
    • 5.windowOpacity
    • 6.cursor
    • 8.font
    • 9.toolTip
    • 10.focusPolicy
    • 11.styleSheet


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)
    • 混合三种不同颜⾊的数值⽐例,就能搭配出千千万万的颜⾊出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024新版ChatGPT系统源码SparkAi系统,支持GPT4.0全模型,AI绘画,AI换脸+自定义智能体GPTs应用+AI视频+文档分析

一、文章序言 人工智能技术正迅猛发展,AI语言模型、AI绘画和AI视频已经在许多领域得到广泛应用。这些技术不仅在科技创新方面表现出色,还在艺术创作、内容生成和商业应用中展现出巨大的潜力。 SparkAi创作系统是一款基于ChatGPT和Midjourney开发的智能…

【Linux】系列入门摘抄笔记-4-查看文件内容命令cat/more/less/tail

cat 查看文件内容 cat [选项] [参数] cat 命令可以用来显示文本文件的内容(类似于 DOS 下的 type 命令),也可以把几个文件内容附加到另一个文件中,即连接合并文件。 tac 反向显示文件内容 tac [选项] [参数] 将文件全部内容从…

玩转Docker:Lsky pro图床+私有化部署大模型(Ollama+Openwebui)

最近搞了一个测试服务器,捣鼓了下一键搭建dnmp集成环境,然后还搭建了一个Lysk pro图床服务,后面又看到了开源大模型,也试着搭建了一下,中间出了一点小插曲。不过也算搭建成功了。做一个小结汇总。 1.前情回顾 DNMP:基…

探索list与iterator的区别及yield的用法

1 问题 探索list与iterator的区别探索yield的用法 2 方法 通过网上学习后了解到 List返回的类型是list,list只会查询一级缓存。list()中返回的List中每个对象都是原本的对象。查询的时候没遍历一个对象会产生一条sql;而iterator这个迭代器返回的类型是it…

Apache HTTPD 换行漏洞(CVE-2017-15715)

Vulhub - Docker-Compose file for vulnerability environment Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一…

sns.distplot()用法

seaborn.distplot(aNone, binsNone, histTrue,kdeTrue, rugFalse, fitNone, hist_kwsNone,kde_kwsNone, rug_kwsNone, fit_kwsNone,colorNone, verticalFalse, norm_histFalse,axlabelNone, labelNone, axNone, xNone)参数解释 a: 序列series、一维数组或者list,上…

经典街机游戏:拳皇97 for Mac(KOF97) 支持M1 中文移植版

游戏玩家一定会上手的游戏就是拳皇系列了吧,其中最经典的就是拳皇97,小编为大家提供的就是拳皇97mac版,熟悉的场景,熟悉的操作,原来Mac上打街机也可以这么爽,亲测拳皇97 for Mac 支持M1 Mac,喜欢…

ASP.NET Core Web API 使用Autofac框架

总目录 前言 主要介绍如何在ASP.NET Core Web API 使用Autofac框架 一、创建ASP.NET Core Web API 我们先创建一个ASP.NET Core Web API项目,然后准备相关的代码 1 假如我们需要实现登录的功能,现在我们创建相关的服务接口 public interface ILoginSe…

【vue+mathjax】mathjax的使用

方法一、引用外网的地址 但是使用这个方法&#xff0c;会报跨域&#xff0c;所以需要注意 第一步&#xff1a;在public/index.html中引入地址 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatib…

【uniapp】uniapp+vue2微信小程序实现分享功能

uniappvue2做的微信小程序实现分享功能 问题描述 uniappvue2做的微信小程序&#xff0c;发布以后点击右上角三个点&#xff0c;分享小程序的时候&#xff0c;转发和分享按钮都是灰色 解决方案 转发、分享、复制链接这几个功能需要自己来手动写方法&#xff0c;考虑到每个页…

文件上传漏洞(二,靶场搭建及漏洞利用)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 一&#xff0c;靶场搭建。 靶场链接 1&#xff0c;下载zip文件到PHP study下的www文件夹内&#xff0c;并解压。 2&#xff0c;创建网站。 此处php版本应选择较老版本&…

记两次非常规文件上传Getshell

常规绕过前端和后端的任意文件上传已经没意思了&#xff0c;本文记录下之前和最近遇到的2个不太常规的任意文件上传Getshell的案例。 路径穿越文件上传Get Shell Nmap快速全端口扫描发现开放22&#xff0c;80和3306端口。访问目标&#xff0c;使用hfinger扫描发现Web应用使用…

【GD32 MCU入门教程】七、分散加载说明

分散加载说明以GD32F103ZE为例&#xff0c;分别用Keil、IAR和Embedded Builder工具实现&#xff1a;将函数放置某个地址、将常量放置某个地址、将函数放在RAM中运行的三种效果。 1、将led_toggle()函数放在0x08040000地址后。 2、将tempbuf[1024]常量放在0x08020000地址后。 …

JavaWeb中的前端工程化

本笔记基于【尚硅谷全新JavaWeb教程&#xff0c;企业主流javaweb技术栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_sourcea91dafe0f846ad7bd19625e392cf76d8总结 第七章 前端工程化 一、前端工程化开篇 1.1 什么是前端工程化 前端工程化是使用软件工程的方法来单独…

借用BI系统又快又灵活地完成财务数据分析

和其他BI软件相比&#xff0c;奥威BI软件在财务分析上的表现十分突出&#xff0c;不仅能快速对接金蝶ERP&#xff0c;完成科目多变的财务指标计算分析&#xff0c;把复杂财务数据变得通俗易懂&#xff0c;还支持自助分析。从奥威BI软件的表现上看&#xff0c;说它是一款BI财务分…

[MIT6.5840]Lab3A leader election

文章目录 Part 3A: leader election大致框架详细过程数据结构初始化选举计时器选举过程心跳机制 LeaderRPC其他函数 测试结果完整代码 Part 3A: leader election 实验地址 https://pdos.csail.mit.edu/6.824/labs/lab-raft.html 论文地址 https://pdos.csail.mit.edu/6.824/pa…

【乐吾乐2D可视化组态编辑器】后端API接口文档

后端API接口文档 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 采用前后端分离架构&#xff0c;乐吾乐后端服务提供一整套完整的web组态编辑器的所有数据接口&#xff0c;包含2D/3D图纸接口服务、文件接口服务和用户接口服务等&#xff0c;安装包版本提…

Linux 文件系统、动静态库

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、文件系统 1、了解磁盘的存储结构 1.基本知识 2.磁盘中盘片为什么高速旋转&#xff1f; 3.磁头为什么要左右摇摆&#xff1f; 4.如何找到一个指定位置的扇区&#xff1f; 5.文件在磁盘…

英语口语成人英语生活英语口语表达四六级英语培训柯桥小语种学习

全红婵向外国人展示金牌夺冠后&#xff0c;全红婵向外国友人展示金牌。视频中&#xff0c;一位外国男子对全红婵说&#xff1a;“How are you&#xff1f;”全红婵回应&#xff1a;“Good&#xff01;Good&#xff01;全红婵比出“拿捏”手势对方说全红婵是奥运冠军&#xff0c…

使用es-hadoop同步hive和es之间数据

&#x1f4bb;近期在华为云连接es时的时候发现不能输入账号密码&#xff0c;后面联系华为工程师了解到&#xff0c;华为云默认是非安全模式&#xff0c;即不需要输入账号密码。 如果对你有所帮助&#xff0c;欢迎点赞收藏关注不迷路哦&#x1f493; 目录 使用es-hadoop同步h…