Qt 常用控件 - 3
本文介绍了Qt中两个常用控件的API及使用示例: 窗口透明度控制 使用windowOpacity()和setWindowOpacity()方法控制窗口透明度,范围0.0(透明)到1.0(不透明) 提供了通过按钮增减透明度的代码实现,包含透明度的边界检查 鼠标光标设置 通过cursor()和setCursor()方法设置控件光标 演示了系统内置光标(如WaitCursor)和自定义图片光标的实现 介

Qt 常用控件 - 2
https://blog.csdn.net/Small_entreprene/article/details/149610710?spm=1001.2014.3001.5502
windowOpacity(窗口透明度)
API 说明
-
windowOpacity():获取控件的不透明数值,返回值为float类型,取值范围为0.0到1.0。其中,0.0表示完全透明,1.0表示完全不透明。 -
setWindowOpacity(float n):设置控件的不透明数值。
opacity 相比于叫做“透明度”,可能叫做不透明度更合适,因为其数值越大,越不透明!
代码示例:调整窗口透明度
在界面上拖放两个按钮:
-
分别用来增加不透明度和减少不透明度。
-
objectName分别为pushButton_add和pushButton_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 中设置字体属性
-
在界面上创建一个 label。

-
在右侧的属性编辑区,设置该 label 的
font相关属性。在这里调整上述属性,可以实时看到文字的变化。
-
执行程序,观察效果。

通过属性编辑的方式,虽然能够快速方便的修改文字相关的属性,但是还不够灵活。如果程序运行过程中,需要修改文字相关的属性呢?就需要通过代码来操作!
代码示例:在代码中设置字体属性
-
在界面上创建 label,
objectName使用默认的label即可。 -
修改
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); } -
运行程序,观察效果。

实际开发中字体属性的选择
字体属性的选择是一个“审美问题”,而不是“技术问题”,往往需要一定的艺术细胞。幸运的是,公司中通常有专业的“美工”或“设计”岗位来负责这方面的工作,程序员只需按照设计稿进行实现即可,不必过多考虑搭配问题。
toolTip(提示信息)
API 说明
-
setToolTip:设置 toolTip。鼠标悬停在该 widget 上时会有提示说明。 -
setToolTipDuration:设置 toolTip 提示的时间,单位为 ms。时间到后 toolTip 自动消失。toolTip 仅用于用户查看,代码中一般不需要获取 toolTip。--- 设置提示的时间
代码示例:设置按钮的 toolTip
-
在界面上拖放两个按钮,
objectName分别设置为pushButton_yes和pushButton_no。 -
编写
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); } -
运行程序,观察效果。鼠标停在按钮上后,会弹出提示,时间到后自动消失。

focusPolicy(焦点策略)
focusPolicy 用于设置控件获取焦点的策略,例如某个控件能否用鼠标选中或者能否通过 Tab 键选中。所谓“焦点”,指的就是能选中这个元素,接下来的操作(比如键盘操作)都是针对该焦点元素进行的。这对于输入框、单选框、复选框等控件非常有用。
计算机中的“ 焦点 ”,对于键盘操作非常明显 --- 比如有一个输入框,我们必须要先选中输入框,接下来我们键盘输入的文本才可以输入到输入框中去!

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

GUI 中,窗口/控件 的焦点是非常关键的:因为哪一个对象得到了焦点,接下来的操作就是针对哪一个控件了!
一般来说,一个控件获取到焦点,主要是两种方式:
- 鼠标点击
- 键盘上的 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
-
在界面上创建四个单行输入框(Line Edit)。

-
修改四个输入框的
focusPolicy属性为Qt::StrongFocus(默认取值,一般不用额外修改)。此时运行程序,可以看到,使用鼠标单击/Tab,就可以移动光标所在输入框,从而接下来的输入就是针对这个获取焦点的输入框展开的。
-
修改第二个输入框的
focusPolicy为Qt::NoFocus,则第二个输入框不会被 Tab/鼠标左键选中。此时这个输入框也就无法输入内容。
-
修改第二个输入框
focusPolicy为Qt::TabFocus,则只能通过 Tab 选中,无法通过鼠标选中。
-
修改第二个输入框
focusPolicy为Qt::ClickFocus,则只能通过鼠标选中,无法通过 Tab 键选中。
重点是我们需要理解“ 焦点 ”这个概念!!!
更多推荐
所有评论(0)