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

Qt 常用控件 - 3

Qt 常用控件 - 2https://blog.csdn.net/Small_entreprene/article/details/149610710?spm=1001.2014.3001.5502

windowOpacity窗口透明度

API 说明
  • windowOpacity():获取控件的不透明数值,返回值为 float 类型,取值范围为 0.01.0。其中,0.0 表示完全透明,1.0 表示完全不透明。

  • setWindowOpacity(float n):设置控件的不透明数值。

opacity 相比于叫做“透明度”,可能叫做不透明度更合适,因为其数值越大,越不透明!

代码示例:调整窗口透明度

在界面上拖放两个按钮

  • 分别用来增加不透明度和减少不透明度。

  • objectName 分别为 pushButton_addpushButton_sub

编写 widget.cpp,实现两个按钮的槽函数

  • 点击 pushButton_sub 会减少不透明度,窗口越来越透明。

  • 点击 pushButton_add 会增加不透明度,窗口逐渐恢复。

void Widget::on_pushButton_add_clicked()
{float opacity = this->windowOpacity(); // 获取当前透明度if (opacity >= 1.0) { // 如果已经是完全不透明,直接返回return;}qDebug() << "当前透明度:" << opacity; // 打印当前透明度opacity += 0.1; // 增加透明度this->setWindowOpacity(opacity); // 设置新的透明度
}void Widget::on_pushButton_sub_clicked()
{float opacity = this->windowOpacity(); // 获取当前透明度if (opacity <= 0.0) { // 如果已经是完全透明,直接返回return;}qDebug() << "当前透明度:" << opacity; // 打印当前透明度opacity -= 0.1; // 减少透明度this->setWindowOpacity(opacity); // 设置新的透明度
}

运行程序

  • 点击减少透明度按钮(pushButton_sub)后,可以看到窗口逐渐变透明,透过窗口可以看到后面的桌面或其他窗口。

  • 点击增加透明度按钮(pushButton_add)后,窗口会逐渐恢复不透明状态。

  • 同时,控制台中会显示透明度数值的变化。

注意

我们打印的日志并没有我们想象的那么美好:

1
0.898039
0.796078
0.694118
0.592157
0.490196
0.388235
0.286275
0.184314
0.0823529
  • C++ 中的 float 类型遵循 IEEE 754 标准,因此在进行运算时可能会有一定的精度误差。例如,1.0 - 0.1 的结果可能并不是精确的 0.9


cursor(鼠标光标)

API 说明
  • cursor():获取当前控件的光标属性,返回 QCursor 对象。

  • setCursor(const QCursor& cursor):设置控件的光标形状。仅在鼠标悬停在该控件上时生效。

  • QGuiApplication::setOverrideCursor(const QCursor& cursor):设置全局光标形状(程序内的全局,不是系统内的全局),对整个程序中的所有控件都生效,覆盖上面的 setCursor 设置的内容。

代码示例:在 Qt Designer 中设置按钮的光标

在界面中创建一个按钮

直接在右侧属性编辑区修改 cursor 属性为“等待”

运行程序:鼠标悬停到按钮上时,光标会显示为等待状态(沙漏形状)。

代码示例:通过代码设置按钮的光标

编写 widget.cpp

  • 使用 Qt::WaitCursor 设置按钮的光标为等待状态。

#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建按钮QPushButton* button = new QPushButton(this);button->resize(100, 50);button->move(100, 100);button->setText("这是一个按钮");// 设置按钮的光标为等待状态button->setCursor(QCursor(Qt::WaitCursor));
}

运行程序

  • 鼠标悬停到按钮上时,光标会显示为等待状态(沙漏形状)。

系统内置的光标形状

可以通过 Ctrl + 左键 点击 Qt::WaitCursor 跳转到源码查看所有光标形状:

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 资源文件:添加前缀 /,并加入 huaji.png 图片。

编写 widget.cpp:使用自定义图片作为光标。

QPixmap 通过这个对象就表示一个图片! 

QCursor cursor(pixmap, 2, 2); --- 以图片左上角为(0, 0)原点,找到(2, 2)这个位置作为鼠标真正点击的位置!

#include <QPixmap>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建一个位图对象,加载自定义光标图片QPixmap pixmap(":/huaji.png");// 缩放图片为 64 * 64 的尺寸pixmap = pixmap.scaled(64, 64);// 创建 QCursor 对象,并指定“热点”为 (2, 2) 坐标位置QCursor cursor(pixmap, 2, 2);// 设置光标this->setCursor(cursor);
}

运行程序

  • 鼠标光标会显示为自定义的滑稽图片。--- 阿里巴巴矢量图标志(免费开源,可从此下载)

font(字体)

API 说明
  • font():获取当前 widget 的字体信息,返回一个 QFont 对象。

  • setFont(const QFont& font):设置当前 widget 的字体信息。

关于 QFont类 --- 字体相关
类的属性说明
family字体家族,例如 "楷体"、"宋体"、"微软雅黑" 等。
pointSize字体大小。单位:像素  px
weight字体粗细,以数值方式表示粗细程度,取值范围为 [0, 99],数值越大越粗。
bold是否加粗。设置为 true,相当于 weight 为 75;设置为 false,相当于 weight 为 50。
italic是否倾斜。
underline是否带有下划线。
strikeOut是否带有删除线。
代码示例:在 Qt Designer 中设置字体属性
  1. 在界面上创建一个 label。

  2. 在右侧的属性编辑区,设置该 label 的 font 相关属性。在这里调整上述属性,可以实时看到文字的变化。

  3. 执行程序,观察效果。

通过属性编辑的方式,虽然能够快速方便的修改文字相关的属性,但是还不够灵活。如果程序运行过程中,需要修改文字相关的属性呢?就需要通过代码来操作! 

代码示例:在代码中设置字体属性
  1. 在界面上创建 label,objectName 使用默认的 label 即可。

  2. 修改 widget.cpp

    Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
    {ui->setupUi(this);// 设置 label 的文本内容ui->label->setText("这是一段文本");// 创建字体对象QFont font;// 设置字体家族font.setFamily("仿宋");// 设置字体大小font.setPointSize(20);// 设置字体加粗font.setBold(true);// 设置字体倾斜font.setItalic(true);// 设置字体下划线font.setUnderline(true);// 设置字体删除线font.setStrikeOut(true);// 设置字体对象到 label 上ui->label->setFont(font);
    }
  3. 运行程序,观察效果。

实际开发中字体属性的选择

字体属性的选择是一个“审美问题”,而不是“技术问题”,往往需要一定的艺术细胞。幸运的是,公司中通常有专业的“美工”或“设计”岗位来负责这方面的工作,程序员只需按照设计稿进行实现即可,不必过多考虑搭配问题。


toolTip(提示信息)

API 说明
  • setToolTip:设置 toolTip。鼠标悬停在该 widget 上时会有提示说明。

  • setToolTipDuration:设置 toolTip 提示的时间,单位为 ms。时间到后 toolTip 自动消失。toolTip 仅用于用户查看,代码中一般不需要获取 toolTip。--- 设置提示的时间

代码示例:设置按钮的 toolTip
  1. 在界面上拖放两个按钮,objectName 分别设置为 pushButton_yespushButton_no

  2. 编写 widget.cpp

    Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
    {ui->setupUi(this);ui->pushButton_yes->setToolTip("这个是 yes 按钮");ui->pushButton_yes->setToolTipDuration(3000);ui->pushButton_no->setToolTip("这个是 no 按钮");ui->pushButton_no->setToolTipDuration(10000);
    }
  3. 运行程序,观察效果。鼠标停在按钮上后,会弹出提示,时间到后自动消失。

focusPolicy(焦点策略)

focusPolicy 用于设置控件获取焦点的策略,例如某个控件能否用鼠标选中或者能否通过 Tab 键选中。所谓“焦点”,指的就是能选中这个元素,接下来的操作(比如键盘操作)都是针对该焦点元素进行的。这对于输入框、单选框、复选框等控件非常有用。

计算机中的“ 焦点 ”,对于键盘操作非常明显 --- 比如有一个输入框,我们必须要先选中输入框,接下来我们键盘输入的文本才可以输入到输入框中去!

就像魔兽争霸的选中不同的单位,然后再下达命令:选中的就是相当于获取到了焦点!

GUI 中,窗口/控件 的焦点是非常关键的:因为哪一个对象得到了焦点,接下来的操作就是针对哪一个控件了! 

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

  1. 鼠标点击
  2. 键盘上的 Tab
API 说明
  • focusPolicy():获取该 widget 的 focusPolicy,返回 Qt::FocusPolicy

  • setFocusPolicy(Qt::FocusPolicy policy):设置 widget 的 focusPolicy

Qt::FocusPolicy 枚举类型
  • Qt::NoFocus:控件不会接收键盘焦点。--- 不管是鼠标点击还是 Tab --- Label 本身就是

  • Qt::TabFocus:控件可以通过 Tab 键接收焦点。

  • Qt::ClickFocus:控件在鼠标点击时接收焦点。

  • Qt::StrongFocus:控件可以通过 Tab 键和鼠标点击接收焦点(默认值)。

  • Qt::WheelFocus:类似于 Qt::StrongFocus,同时控件也通过鼠标滚轮获取到焦点(新增的选项,一般很少使用)。

代码示例:理解不同的 focusPolicy
  1. 在界面上创建四个单行输入框(Line Edit)。

  2. 修改四个输入框的 focusPolicy 属性为 Qt::StrongFocus(默认取值,一般不用额外修改)。此时运行程序,可以看到,使用鼠标单击/Tab,就可以移动光标所在输入框,从而接下来的输入就是针对这个获取焦点的输入框展开的。

  3. 修改第二个输入框的 focusPolicyQt::NoFocus,则第二个输入框不会被 Tab/鼠标左键选中。此时这个输入框也就无法输入内容。

  4. 修改第二个输入框 focusPolicyQt::TabFocus,则只能通过 Tab 选中,无法通过鼠标选中。

  5. 修改第二个输入框 focusPolicyQt::ClickFocus,则只能通过鼠标选中,无法通过 Tab 键选中。

 重点是我们需要理解“ 焦点 ”这个概念!!!

http://www.dtcms.com/a/307801.html

相关文章:

  • 基于PyTorch利用CNN实现MNIST的手写数字识别
  • RAG:让AI更聪明的“外接大脑“ | AI小知识
  • MacroDroid Pro 功能强大的任务自动化和配置应用程序
  • PHP 与 MySQL 详解实战入门(1)
  • 发票闪印 v3.9.17 免费电子PDF发票批量打印工具绿色版
  • css 不错的按钮动画
  • 22.(vue3.x+vite) 组件动态导入 (懒加载defineAsyncComponent)
  • 超简单的跳动爱心
  • 数据库的隔离级别和mysql的隔离级别
  • Go语言实战:创建一个简单的 HTTP 服务器
  • uni-app用css编写族谱树家谱树
  • Docker 初学者需要了解的几个知识点 (六):docker-compose.yml (ThinkPHP)
  • Cursor结合Playwright MCP Server支持自动化
  • ACID原子性:确保数据库操作的可靠性
  • Docker 安装部署 OceanBase
  • QT5 widget控件设置背景图不生效的解决方案
  • 【运维基础】Linux 文件系统基本管理
  • win和Linux下载huggingface模型的方法
  • 【Linux】linux基础开发工具(二) 编译器gcc/g++、动静态库感性认识、自动化构建-make/Makefile
  • 交叉编译ARM环境
  • CentOS 6.10 上安装 GCC 7+
  • 计算机视觉CS231n学习(1)
  • Web3:在 VSCode 中基于 Foundry 快速构建 Solidity 智能合约本地开发环境
  • Excel 知识点汇总
  • 硬核技术协同:x86 生态、机密计算与云原生等技术如何为产业数字化转型筑底赋能
  • RabbitMQ 的死信队列完整指南 (With Spring Boot)
  • 云原生环境 DDoS 防护:容器化架构下的流量管控与弹性应对
  • Vmvare虚拟机的网络不可达问题
  • Java项目:基于SSM框架实现的网络财务管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 【学无止境,每天一题】[HNOI2003]激光炸弹