当前位置: 首页 > news >正文

【Qt】界面定制艺术:光标(cursor)、字体(font)、提示(toolTip)、焦点(focusPolicy)与样式表(styleSheet)的深度探索

文章目录

  • 前言:
  • 1. cursor: 设置按钮的光标
  • 2. front:设置字体
  • 3. toolTip: 鼠标悬停提示
  • 4. focusPolicy:设置控件获取到焦点的策略
  • 5. styleSheet : 样式表
  • 总结:

前言:

在现代软件开发中,用户界面(UI)的设计和实现是至关重要的一环。一个直观、美观且响应用户操作的界面可以极大地提升用户体验。Qt作为一个跨平台的C++应用程序框架,提供了丰富的工具和类库来帮助开发者创建和管理复杂的用户界面。本文将介绍Qt中的一些关键UI组件和属性,包括光标设置、字体样式、鼠标悬停提示、焦点策略和样式表的应用。通过这些知识点,开发者可以更深入地理解如何在Qt中定制和优化应用程序的外观和行为。

1. cursor: 设置按钮的光标

在这里插入图片描述
cursor()setCursor():Widget 级别的,同一个界面中,不同的控件可以设置成不同不同的光标。
QGuiApplication::setOverrideCursor(): 设置全局光标(程序内的全局,而不是系统级别的全局)

可以直接在图形化界面上改:
在这里插入图片描述
也可以通过代码来改:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QCursor cursor(Qt::WaitCursor);ui->pushButton->setCursor(cursor); // 在按钮上生效this->setCursor(cursor); // 在窗口上生效
}Widget::~Widget()
{delete ui;
}

这些都是 Qt 中内置的光标形状:

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       // 自定义光标
};

Qt 允许我们通过自定义的图片来设置光标

先准备一个图片,吧图片导入到项目中(qrc管理)
在代码中访问到这个图片,基于这个图片构造出光标对象并设置。
在这里插入图片描述
QPixmap 通过这个对象就表示一个图片

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 访问到图片QPixmap pixmap(":/gb1.jpg");pixmap = pixmap.scaled(50, 50); // 对图片进行缩放, 注意是副本,还要重新赋值回去// 构造光标对象QCursor cursor(pixmap, 10, 10); // 默认情况下,鼠标点击时,相当于图片的左上角在点击,// 10,10 热点, 以图片的左上角位原点,找到10,10这个位置作为鼠标真正的点击的位置了//ui->pushButton->setCursor(cursor); // 在按钮上生效this->setCursor(cursor); // 在窗口上生效
}Widget::~Widget()
{delete ui;
}

图片下载:阿里巴巴矢量图标库(免费下载):
https://www.iconfont.cn/

2. front:设置字体

在这里插入图片描述
关于Qfront
在这里插入图片描述
在这里插入图片描述
改了啥属性,这边能立即显示出来
通过属性编辑这样的方式,虽然能够快速方便的修改文字相关的属性,但是还不够灵活。
如果程序运行过程中需要修改文字相关属性,就需要通过代码来操作了。

#include "widget.h"
#include "ui_widget.h"
#include <QLabel>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLabel* label = new QLabel(this);label->setText("这是一段文本");// 创建字体对象QFont font;font.setFamily("仿宋");font.setPixelSize(30);font.setBold(true);font.setItalic(true);font.setUnderline(true);font.setStrikeOut(true);// 把font对象设置到 label 中label->setFont(font);
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述

3. toolTip: 鼠标悬停提示

一个GUI程序,界面比较复杂,按钮啥的很多,当你把鼠标悬停到这个控件上的时候,就能弹出一个提示。
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置这两个按钮的 toolTipsui->pushButton_Yes->setToolTip("这是一个 Yes 按钮");ui->pushButton_Yes->setToolTipDuration(3000); // 提示3sui->pushButton_No->setToolTip("这是一个 No 按钮");ui->pushButton_No->setToolTipDuration(3000);
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述

4. focusPolicy:设置控件获取到焦点的策略

计算机中的“焦点”,对于键盘操作非常明显
界面上有一个输入框,此时必须要选中这个输入框,接下来键盘才会输入到输入框中
如果选中的是别的控件,或别的窗口,此时键盘的输入就 不会输入到这个输入框中。
在这里插入图片描述
Qt::FocusPolicy 是⼀个枚举类型. 取值如下
Qt::NoFocus :控件不会接收键盘焦点
Qt::TabFocus :控件可以通过Tab键接收焦点
Qt::ClickFocus :控件在鼠标点击时接收焦点
Qt::StrongFocus :控件可以通过Tab键和鼠标点击接收焦点 (默认值)
Qt::WheelFocus : 类似于 Qt::StrongFocus , 同时控件也通过鼠标滚轮获取到焦点 (新增
的选项, ⼀般很少使用).

一般来说,一个控件获取到焦点,主要是两种方式

  1. 鼠标点击
  2. 键盘的 tab

在这里插入图片描述

5. styleSheet : 样式表

通过CSS设置 widget 的样式。
样式:描述了界面具体是啥样子的 。
CSS 层叠样式表:在进行网页开发的时候,设置网页样式的方式
Qt 就把CSS给参考过来了,搞了一套 QSS,但是相对于CSS来说,功能上的缺失很多的,即使如此也能够帮我们完成不少的效果。
通过 styleSheet 属性进行初步演示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
和CSS类似,QSS设置的样式也是 键值对 的格式
键和值之间使用:分隔。
键值对和键值对之间,使用; 分隔

通过代码设置样式
实现一个“夜间模式”功能

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_light_clicked()
{// 设置窗口的样式this->setStyleSheet("background-color: white;");// 设置输入框的样式ui->textEdit->setStyleSheet("background-color: white; color:black;");// 设置按钮的样式ui->pushButton_light->setStyleSheet("color:black;");ui->pushButton_dark->setStyleSheet("color:black;");
}void Widget::on_pushButton_dark_clicked()
{// 设置窗口的样式this->setStyleSheet("background-color: black;");// 设置输入框的样式ui->textEdit->setStyleSheet("background-color: black; color:white;");// 设置按钮的样式ui->pushButton_light->setStyleSheet("color:white;");ui->pushButton_dark->setStyleSheet("color:white;");
}

在这里插入图片描述
white; CCS/QSS 中可以直接使用单词来设置颜色:white,black,red,green,blue,yellow…
颜色的种类有无数种,在计算机中,使用RGB的方式来表示颜色 。(0 - 255; 0x0 - 0xFF)
最终表示一个颜色,就是使用
1)rgb(255, 0, 255)
2) #FF00FF

Widget 的初始数值是多少数值呢?
取色器:(PS)
QQ=> 截图,内置了取色器!
在这里插入图片描述

this->setStyleSheet("background-color: rgb(240,240,240);");

总结:

本文详细介绍了Qt中用于增强用户界面交互性和美观性的五个关键属性和方法:光标(cursor)、字体(font)、工具提示(toolTip)、焦点策略(focusPolicy)和样式表(styleSheet)。通过设置光标,开发者可以改变指针的形态,以适应不同的交互场景;通过字体设置,可以定制文本的显示样式;工具提示提供了一种方便的方式来显示控件的功能描述;焦点策略决定了控件如何接收和处理焦点;而样式表则允许开发者使用类似CSS的方式来美化界面元素。
此外,文章还提供了一些实用的代码示例,展示了如何在Qt中实现自定义光标、设置字体样式、添加鼠标悬停提示、改变控件的焦点策略以及使用样式表来改变界面的视觉效果。这些示例不仅有助于理解Qt的UI定制机制,也展示了如何通过编程来动态改变UI元素的样式和行为。
最后,文章提供了一个关于如何使用阿里巴巴矢量图标库下载免费图标的链接,这对于需要图标资源的开发者来说是一个宝贵的资源。通过这些工具和技巧,Qt开发者可以创建出既符合功能需求又具有吸引力的用户界面。

相关文章:

【Qt】界面定制艺术:光标(cursor)、字体(font)、提示(toolTip)、焦点(focusPolicy)与样式表(styleSheet)的深度探索

文章目录 前言&#xff1a;1. cursor: 设置按钮的光标2. front&#xff1a;设置字体3. toolTip: 鼠标悬停提示4. focusPolicy&#xff1a;设置控件获取到焦点的策略5. styleSheet : 样式表总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;用户界面(UI)的设计和…...

Python GraphQL服务器实现库之tartiflette使用详解

概要 Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程库如asyncio之上,提供了高性能的GraphQL执行环境。Tartiflette专注于提供最佳的开发者体验,支持最新的GraphQL特性。 安装 安装Tartiflette相对简单,但需要依赖于一些系统级的库。 首先,需…...

面试官:请介绍类加载过程,什么是双亲委派模型?

&#x1f680;类加载过程是指在 Java 程序运行时&#xff0c;将类的字节码文件加载到内存中并转换为 Class 对象的过程。Java 类加载器负责加载类&#xff0c;其主要任务是在运行时查找和装载类文件&#xff0c;以生成对应的 Class 对象。 Java的类加载过程一般可以分为以下几个…...

mysql 细分

索引选择性 索引列的唯一值数量 / 表中的总行数 mysql如何优化-CSDN博客 批量问题 批处理默认是逐条发送 SQL 到数据库的&#xff0c;没有充分利用数据库提供的原生批处理能力&#xff0c;需要额外的配置来启用真正的批处理支持&#xff0c;如使用ExecutorType.BATCH 自定…...

数据驱动实战二

目标 掌握数据驱动的开发流程掌握如何读取JSON数据文件巩固PO模式 1. 案例 对TPshop网站的登录模块进行单元测试 1.1 实现步骤 编写测试用例采用PO模式的分层思想对页面进行封装编写测试脚本定义数据文件&#xff0c;实现参数化 1.2 用例设计 1.3 数据文件 {"login…...

解决参考文献自动生成标号,换行时自动缩进

问题如下图所示&#xff0c;红色方框部分应该填充内容&#xff0c;但自动生成标号时不会填充&#xff1a; 解决方案&#xff1a; 1. 选中内容&#xff1a; 2. 找到布局-段落&#xff1a; 3. 选择“无”&#xff0c;即可。...

网络安全专业岗位详解+自学学习路线图

很多网安专业同学一到毕业就开始迷茫&#xff0c;不知道自己能去做哪些行业&#xff1f;其实网络安全岗位还是蛮多的&#xff0c;下面我会介绍一些网络安全岗位&#xff0c;大家可以根据自身能力与喜好决定放哪个方向发展。 渗透测试/Web安全工程师 主要是模拟黑客攻击&#…...

mybatisPlus一个事务中切换数据源概述

概述 在多数据源的配置下&#xff0c;业务中经常遇到在一个被本地事务包裹的save/edi方法中需要查询另一个数据源的数据&#xff1b; 直接查询会提示table不存在&#xff0c;这是因为一个事务和一个mysql连接是绑定的&#xff0c;mysql的连接背后包含了数据库信息&#xff0c;…...

如何在Android手机上恢复已删除的视频?

有时&#xff0c;由于不同的原因&#xff0c;可能会发生意外的数据丢失灾难。 那么如何在Android手机内存或没有计算机的情况下恢复已删除的视频呢&#xff1f;本文将给你一个答案。 如何在Android上恢复已删除的视频&#xff1f; 不要惊慌&#xff01;您可以在Android手机上恢…...

【项目实战】使用Github pages、Hexo如何10分钟内快速生成个人博客网站

文章目录 一.准备工作1.安装git2.安装node安装 cnpm 3.使用 GitHub 创建仓库&#xff0c;并配置 GitHub Pages0.Github Pages是什么1. 在 GitHub 上创建一个新仓库2. 创建您的静态网站3. 启用 GitHub Pages4. 等待构建完成5. 访问您的网站 二. Hexo1.什么是Hexo2.安装Hexo1. 安…...

大数据中服役新数据节点和退役旧节点步骤(hive,hadoop)

1- 节点上线操作 当要新上线数据节点的时候 &#xff0c;需要把数据节点的名字追加在 dfs.hosts &#xff08;1&#xff09;关闭新增节点的防火墙 &#xff08;2&#xff09;在 NameNode 节点的 hosts 文件中加入新增数据节点的 hostname &#xff08;3&#xff09;在每个新…...

数论:不定方程的引入

研究的对象&#xff1a;不定方程 文章目录 研究的对象&#xff1a;不定方程不定方程引入&#xff1a;裴蜀定理证明&#xff1a;欧几里得算法证明&#xff1a;充分性证明&#xff1a;必要性证明&#xff1a; 战术总结&#xff1a; 不定方程引入&#xff1a; 不定方程&#xff0…...

数据中心法

数据中心法是实现词法分析器的结构化方法。通过设计主表和子表分开存储状态转移信息&#xff0c;实现词法分析器的控制逻辑和数据结构分离。 主要解决了状态爆炸、难以维护和复杂性的问题。 状态爆炸是指当状态和转移较多时&#xff0c;单一使用一个表来存储所有的信息的话会导…...

pdffactory pro8.0虚拟打印机(附注册码)

PdfFactory pro是一款非常受欢迎的PDF虚拟打印机&#xff0c;可以帮助用户将你的其他文档保存为PDF格式。请为用户提供打印/发送/加密等多种实用功能&#xff0c;以及一套完善的PDF打印方案。 使用说明 下载pdfFactory Pro压缩包&#xff0c;解压后&#xff0c;双击exe文件&am…...

处理用户输入

目录 一、传递参数 1.1 读取参数 1.2 读取脚本名 二、跟踪参数 三、移动参数 四、处理选项 4.1 查找选项 4.1.1 处理简单选项 4.1.2 分离参数和选项 4.1.3 处理含值的选项 五、选项标准化 5.1 使用 getopt 命令 5.1.1 命令格式 5.1.2 在脚本中使用getopt 5.2 使用…...

在装有centOS7的虚拟机上进行MySQL的安装部署

1.MySQL数据库介绍 1.开源的&#xff0c;跨平台的&#xff0c;社区版免费 2.支持多种存储引擎 3.支持多种主从复制 MySQL版本&#xff1a;5.6 5.7 8.0 https://www.mysql.com MySQL官网 2.安装MySQL5.7 1.配置MySQL仓库 2.安装MySQL服务端软件 3.启动MySQL服务 s…...

【vivado】debug相关时钟及其约束关系

一、前言 在xilinx fpga的degug过程中&#xff0c;经常出现由于时钟不对而导致的观测波形失败&#xff0c;要想能够解决这些问题需要了解其debug的组成环境以及之间的数据流。本文主要介绍debug过程中需要的时钟及各时钟之间的关系。 二、debug相关时钟 Vivado 硬件管理器使…...

什么是HTTP/2?

HTTP/2&#xff08;原名HTTP 2.0&#xff09;即超文本传输协议第二版&#xff0c;使用于万维网。HTTP/2主要基于SPDY协议&#xff0c;通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措&#xff0c;来减少网络延迟&#xff0c;提高客户端的页面加载…...

【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件

文章目录 1. 介绍2. 使用方法2.1 安装 Tampermonkey2.2 安装脚本2.3 使用 3. 详细文档指引4. 反馈5. 未来计划6. 开源协议X. Changelog 1. 介绍 有时我们希望看到 ChatGPT 的消息时间&#xff0c;但 ChatGPT 并没有显示消息时间的功能。 本项目通过 Tampermonkey 开发&#xf…...

STM:TIM定时器——定时中断

文章目录 1、TIM定时器1.1定时器类型1.2定时中断的基本结构 2 定时器初始化2.2 初始化定时器的步骤2.3 TIM库函数2.4 配置TIM2.4.1 Timer.c2.4.2 Timer.c2.4.3 main.c 1、TIM定时器 定时器的功能可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。 他包含…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...