当前位置: 首页 > 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.lryc.cn/news/606104.html

相关文章:

  • vue-seamless-scroll 与 echarts 三联水球图循环滚动的渲染难题-出现短暂空白
  • iOS高级开发工程师面试——其他
  • Linux大页内存导致服务内存不足
  • Java——方法
  • 基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析实践技术应用
  • EEG手工特征提取总结
  • RagFlow本地源码部署(非Docker)
  • 现在有哪些广泛使用的时序数据库?
  • AWS高级解决方案架构师黄海波:GenAI 时代非结构化数据处理的实践与趋势洞察
  • Linux性能检测与调优
  • 解决SparkSQL创建出来的数据库hive中无法识别的问题
  • 切割液性能智能调控系统与晶圆 TTV 预测模型的协同构建
  • toFixed()方法的报错注意
  • Python 程序设计讲义(47):组合数据类型——字典类型:创建字典
  • MySQL常用函数总结
  • 2025年7月最新一区SCI-基尔霍夫定律优化算法Kirchhoff’s law algorithm-附Matlab免费代码
  • [硬件电路-109]:模拟电路 - 自激振荡器的原理,一种把直流能量转换成交流信号的装置!
  • 专题:2025半导体行业研究报告:从AI芯片到封测突围的生死局|附40+份报告PDF、数据汇总下载
  • Apifox 7 月更新|通过 AI 命名参数及检测接口规范、在线文档支持自定义 CSS 和 JavaScript、鉴权能力升级
  • 鸿蒙拉起系统定位和app授权定位
  • 光伏热斑误检率↓79%!陌讯多模态融合算法在智慧能源的落地优化
  • 当文档包含图文混排表格时,如何结合大模型(如DeepSeek-VL)和OCR提取数据
  • 一次 web 请求响应中,通常那个部分最耗时?
  • Flutter module 是如何被原生 Android 项目通过 Gradle 引入的
  • Flutter Chen Generator - yaml配置使用
  • 原生安卓与flutter混编的实现
  • 是否需要买一个fpga开发板?
  • 嵌入式硬件学习(十)—— LED驱动+杂项设备驱动
  • 【Unity】实现小地图
  • TDengine 中 TDgp 中添加算法模型(异常检测)