【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet
文章目录
- 一、windowOpacity
- 1.1 API
- 1.2 代码示例
- 二、cursor
- 2.1 API
- 2.2 代码示例
- 2.3 代码示例
- 三、font
- 3.1 API
- 3.2 代码示例
- 四、setToolTip
- 4.1 API
- 4.1 代码示例
- 五、focusPolicy
- 5.1 API
- 5.1 代码示例
- 六、StyleSheet
- 6.1 API
- 6.1 代码示例
- 🚩总结
一、windowOpacity
1.1 API
API | 说明 |
---|---|
windowOpacity() | 获取到控件的不透明数值。返回 float ,取值为 0.0->1.0 ,其中 0.0 表示全透明,1.0 表示完全不透明 |
setWindowOpacity(float n) | 设置控件的不透明数值,n 取值范围 0.0->1.0 ,0.0 对应全透明,1.0 对应完全不透明 |
1.2 代码示例
代码⽰例:调整窗⼝透明度
- 在界⾯上拖放两个按钮,分别⽤来增加不透明度和减少不透明度.
objectName
分别为pushButton_add
和pushButton_sub
2)编写wdiget.cpp,编写两个按钮的slot函数
- 点击 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);
}
- 执⾏程序,可以看到,点击了⼏下
-
之后,就可以透过窗⼝看到后⾯的Qt界面了.点击+
⼜会逐渐恢复.
同时控制台中也可以看到opacity
数值的变化
注意,C++中float
类型遵守IEEE754
标准,因此在进⾏运算的时候会有⼀定的精度误差.因此1 - 0.1
的数值并⾮是0.9
二、cursor
2.1 API
API | 说明 |
---|---|
cursor() | 获取到当前 widget 的 cursor 属性,返回 QCursor 对象。当鼠标悬停在该 widget 上时,就会显示出对应的形状。 |
setCursor(const QCursor& cursor) | 设置该 widget 光标的形状。仅在鼠标停留在该 widget 上时生效。 |
QGuiApplication::setOverrideCursor(const QCursor& cursor) | 设置全局光标的形状。对整个程序中的所有 widget 都会生效,覆盖上面的 setCursor 设置的内容。 |
2.2 代码示例
代码⽰例:在QtDesigner中设置按钮的光标
- 在界⾯中创建⼀个按钮,直接在右侧属性编辑区修改cursor属性为"忙"
- 运⾏程序,⿏标悬停到按钮上,即可看到光标的变化.
截图⽆法截到⿏标光标,试一试
- 编写widget.cpp
其中Qt::WaitCursor
就是⾃带的沙漏形状的光标,正是上面这个忙.
#include "widget.h"
#include "ui_widget.h"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("这是一个按钮");//设置按钮的cursorbutton->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
};
2)运⾏程序,观察效果.
截图⽆法截到⿏标光标,
2.3 代码示例
代码⽰例:⾃定义⿏标光标
Qt ⾃带的光标形状有限.我们也可以⾃⼰找个图⽚,做成⿏标的光标.
1)创建qrc资源文件,添加前缀/
,并加入hachimitsu.jpg
2) 编写widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建一个位图对象,加载自定义光标图片QPixmap pixmap(":/hachimitsu.jpg");//缩放图片未64*64的尺寸pixmap = pixmap.scaled(64, 64);//创建 QCursor 对象, 并指定"热点" 为(2,2) 坐标位置//所谓"热点", 就是鼠标点击时生效的位置QCursor cursor(pixmap, 2, 2);//设置光标this->setCursor(cursor);}
三、font
3.1 API
API | 说明 |
---|---|
font() | 获取当前 widget 的字体信息,返回 QFont 对象 |
setFont(const QFont& font) | 设置当前 widget 的字体信息 |
font的常见属性
属性 | 说明 |
---|---|
family | 字体家族。比如 “楷体”, “宋体”, “微软雅黑” 等。 |
pointSize | 字体大小 |
weight | 字体粗细。以数值方式表示粗细程度取值范围为 [0, 99],数值越大,越粗。 |
bold | 是否加粗。设置为 true,相当于 weight 为 75。设置为 false 相当于 weight 为 50。 |
italic | 是否倾斜 |
underline | 是否带有下划线 |
strikeOut | 是否带有删除线 |
代码⽰例:在QtDesigner中设置字体属性
- 在界⾯上创建⼀个label,在右侧的属性编辑区,设置该label的font相关属性
在这⾥调整上述属性,可以实时的看到⽂字的变化.
- 执⾏程序,观察效果
3.2 代码示例
代码⽰例:在代码中设置字体属性
- 在界⾯中创建
label
,objectName
使⽤默认的label
即可
修改widget.cpp
#include "widget.h"
#include "ui_widget.h"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);
}
四、setToolTip
4.1 API
API | 说明 |
---|---|
setToolTip | 设置 toolTip。 鼠标悬停在该 widget 上时会有提示说明。 |
setToolTipDuring | 设置 toolTip 提示的时间,单位 ms。 时间到后 toolTip 自动消失。 |
4.1 代码示例
toolTip
只是给⽤⼾看的.在代码中⼀般不需要获取到toolTip
代码⽰例:设置按钮的toolTip
1)在界面上拖放两个按钮.objectName
设置为pushButton_yes
和pushButton_no
2)编写widget.cpp,运⾏程序,观察效果
ui->pushButton_yes->setToolTip(“这是yes按钮”);
ui->pushButton_yes->setToolTipDuration(3000);
ui->pushButton_no->setToolTip(“这个是 no 按钮”);
ui->pushButton_no->setToolTipDuration(3000);
五、focusPolicy
5.1 API
焦点的那些事?
- 设置控件获取到焦点的策略.⽐如某个控件能否⽤⿏标选中或者能否通过tab键选中.
- 所谓"焦点",指的就是能选中这个元素.接下来的操作(⽐如键盘操作),就都是针对该焦点元素进⾏的了.这个对于输⼊框,单选框,复选框等控件⾮常有⽤的.
- 一般来说,一个控件获取到焦点主要是两种方式:鼠标点击 和 键盘Tab键
Qt : : FocusPolicy是一个枚举类型.取值如下 Qt : :NoFocus
:控件不会接收键盘焦点Qt::TabFocus
:控件可以通过Tab键接收焦点Qt::clickFocus:控件在鼠标点击时接收焦点Qt : : strongFocus
:控件可以通过Tab键和鼠标点击接收焦点(默认值)Qt: :wheelFocus
:类似于Qt: : StrongFocus ,同时控件也通过鼠标滚轮获取到焦点(新增的选项,一般很少使用).
5.1 代码示例
代码⽰例:理解不同的focusPolicy
-
在界⾯上创建四个单⾏输⼊框(LineEdit)
-
修改四个输⼊框的
focusPolicy
属性为Qt::StrongFocus
(默认取值,⼀般不⽤额外修改)
此时运⾏程序,可以看到,使⽤⿏标单击/tab,就可以移动光标所在输⼊框.从⽽接下来的输⼊就是针对
这个获取焦点的输⼊框展开的了.
-
修改第⼆个输⼊框的选中. focusPolicy 为Qt::NoFocus ,则第⼆个输⼊框不会被tab/⿏标左键此时
这个输⼊框也就⽆法输⼊内容了. -
修改第⼆个输⼊框focusPolicy 为Qt::TabFocus ,则只能通过tab选中,⽆法通过⿏标选中.
-
修改第⼆个输⼊框focusPolicy 为Qt::ClickFocus ,则只能通过tab选中,⽆法通过⿏标选中.
六、StyleSheet
6.1 API
通过CSS设置widget的样式
css (Cascading Style Sheets层叠样式表)本身属于网页前端技术.主要就是用来描述界面的样式.
所谓"样式",包括不限于大小,位置,颜色, 间距,字体,背景,边框等.我们平时看到的丰富多彩的网页,就都会用到大量的CSS.
Qt虽然是做GUI开发,但实际上和网页前端有很多异曲同工之处.因此Qt也引入了对于CSS的支持.
CSS中可以设置的样式属性⾮常多.基于这些属性Qt只能⽀持其中⼀部分,称为QSS(QtStyleSheet)
具体的⽀持情况可以参考Qt⽂档中"QtStyleSheetsReference"章节.
此处只是进⾏⼀个简单的演⽰.
- 在界⾯上创建label
编辑完成样式之后,Ctrl+R
运行可以看到
6.1 代码示例
1)在界面上创建一个多行输入框(Text Edit)和两个按钮.
objectName
分别为pushButton_light
和pushButton_dark
代码⽰例:实现切换夜间模式.
你当前的代码在逻辑上有些混乱,比如点击“日间模式”和“夜间模式”按钮都设置了 background-color: #333
,这不符合预期。以下是修复并完善的日夜切换完整实现,包含界面样式、控件颜色的区分处理:
-
日间模式:
- 整体背景为浅色(如
#FFFFFF
) - 文本、按钮文字为深色(如
#000000
)
- 整体背景为浅色(如
-
夜间模式:
- 整体背景为深色(如
#333333
) - 文本、按钮文字为浅色(如
#FFFFFF
)
- 整体背景为深色(如
// 日间模式样式设置
void Widget::on_pushButton_light_clicked()
{// 窗口背景this->setStyleSheet("background-color: #FFFFFF;");// 文本编辑框:黑色文字ui->textEdit->setStyleSheet("color: #000000;");// 按钮:黑色文字、浅色背景(可根据需求调整)ui->pushButton_light->setStyleSheet("color: #000000; background-color: #F0F0F0;");ui->pushButton_dark->setStyleSheet("color: #000000; background-color: #F0F0F0;");
}// 夜间模式样式设置
void Widget::on_pushButton_dark_clicked()
{// 窗口背景this->setStyleSheet("background-color: #333333;");// 文本编辑框:白色文字ui->textEdit->setStyleSheet("color: #FFFFFF;");// 按钮:白色文字、深色背景(可根据需求调整)ui->pushButton_light->setStyleSheet("color: #FFFFFF; background-color: #555555;");ui->pushButton_dark->setStyleSheet("color: #FFFFFF; background-color: #555555;");
}
- 编写按钮的槽函数.
使⽤在线调⾊板或者画图板,都可以看到数字对应的颜⾊.参考
https://www.sojson.com/web/online.html
关于计算机中的颜色表示
计算机中使用"像素"表示屏幕上的一个基本单位(也就是一个发亮的光点).
每个光点都使用三个字节表示颜色,分别是R(red),G (green), B (blue)一个字节表示(取值范围是0-255,或者Ox0O-OxFF).
混合三种不同颜色的数值比例,就能搭配出千千万万的颜色出来.
rgb(255,0,0)或者#FF0000或者#F00表示纯红色.rgb(0,255,0)或者 #00FF00或者#0F0表示纯绿色.rgb(0,0,255)或者#0000FF或者#00F表示纯蓝色.rgb(255,255,255)或者#FFFFFF或者#FFF表示纯白色.rgb(0,0,0)或者#000000或者#000表示纯黑色.
当然,上述规则只是针对一般的程序而言是这么设定的.实际的显示器,可能有8bit色深或者10bit色深等,实际情况会更加复杂.
🚩总结
按属性分类梳理,方便查阅:
属性 | 作用说明 |
---|---|
enabled | 设置控件是否可使用,true 表示可用,false 表示禁用 |
geometry | 位置和尺寸,包含 x, y, width, height 四个部分,坐标以父元素为参考设置 |
windowTitle | 设置 widget 标题 |
windowIcon | 设置 widget 图标 |
windowOpacity | 设置 widget 透明度 |
cursor | 鼠标悬停时显示的图标形状(普通箭头、沙漏、十字等),Qt Designer 中有可视化选项 |
font | 字体相关属性(字体家族、大小、粗体、斜体、下划线等样式) |
toolTip | 鼠标悬停在 widget 上时,在状态栏显示的提示信息 |
toolTipDuring | toolTip 显示的持续时间 |
statusTip | Widget 状态改变时(如按钮按下)显示的提示信息 |
whatsThis | 鼠标悬停并按 alt+F1 时,弹出窗口显示的帮助信息 |
styleSheet | 允许用 CSS 设置 widget 样式 |
focusPolicy | 控件获取焦点的策略,包含 Qt::NoFocus /Qt::TabFocus /Qt::ClickFocus /Qt::StrongFocus /Qt::WheelFocus 等 |
contextMenuPolicy | 上下文菜单显示策略,包含 Qt::DefaultContextMenu /Qt::NoContextMenu /Qt::PreventContextMenu 等 |
locale | 设置语言和国家地区 |
acceptDrops | 设置部件是否接受拖放操作,true 接收(触发 dropEvent ),false 拒绝 |
minimumSize | 控件最小尺寸(含最小宽、高) |
maximumSize | 控件最大尺寸(含最大宽、高) |
sizePolicy | 尺寸策略,控制控件在布局管理器中的缩放方式 |
windowModality | 指定窗口是否具备“模态”行为 |
sizeIncrement | 拖动窗口大小时的增量单位 |
baseSize | 窗口基础大小,搭配 sizeIncrement 调整组件尺寸 |
palette | 调色板,设置 widget 颜色风格 |
mouseTracking | 是否跟踪鼠标移动事件,true 持续接收移动事件,false 仅接收按下/释放事件 |
tabletTracking | 是否跟踪触摸屏移动事件(类似 mouseTracking ,Qt 5.9+ 引入) |
layoutDirection | 布局方向,包含 Qt::LeftToRight /Qt::RightToLeft /Qt::GlobalAtomics 等 |
autoFillBackground | 是否自动填充背景颜色 |
windowFilePath | 关联 widget 与本地文件路径(实际作用有限) |
accessibleName | 设置 widget 可访问名称,供辅助技术(如屏幕阅读器)识别 |
accessibleDescription | 设置 widget 详细描述,作用同 accessibleName ,用于无障碍场景 |
inputMethodHints | 针对输入框,提示合法输入格式(如仅数字、仅日期等) |