Qt 常用控件 - 3
Qt 常用控件 - 2https://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 键选中。
重点是我们需要理解“ 焦点 ”这个概念!!!