QT开发——常用控件(2)
windowOpacity
windowOpacity()
获取到控件的不透明数值。返回float,取值为0.0->1.0其中
0.0表示全透明,1.0表示 完全不透明
setWindowOpacity(float n)
设置控件的不透明数值.
代码示例:调整窗口透明度
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_add_clicked()
{//获取不透明度float opacity = this->windowOpacity();//不透明度只能小于等于1.0if(opacity >= 1.0){return;}qDebug() << opacity;opacity += 0.1;//设置不透明度setWindowOpacity(opacity);
}void Widget::on_pushButton_sub_clicked()
{//获取不透明度float opacity = this->windowOpacity();if(opacity <= 0){return;}qDebug() << opacity;opacity -= 0.1;setWindowOpacity(opacity);
}
注意,C++中float类型遵守IEEE 754 标准
规定浮点数要使用二进制 科学计数法 的方式来表示
把一个浮点数分成3个部分:
1)符号位
2)有效数字
3)指数部分
由于是使用二进制表示的有效数字,而且这里是小于0的效数部分,第一个有效数字是0.5,第二个0.25,第三个0.125......由于float和double有效数字部分长度有限,无法凑出一个非常接近0.1的数字
因此在进行运算的时候会有一定的精度误差。因此,1 - 0.1 的数值并非是0.9


代码中我们加了一个判断条件,不过不加也没事,超过1.0的数字(低于0.0)的数字它也设置不进去,相当于setwindowOpacity里边给我们增加了判断条件

但是还是建议把这个判定范围给加上。<代码大全>这本书中提到的——"防御性编程",引用防御性驾驶去解释:别人犯错了,不会对我们自身造成太大伤害。
cursor属性
cursor()
获取到当前 widget 的 cursor 属性,返回 QCursor 对象
当鼠标悬停在该 widget 上时,就会显示出对应的形状
setCursor(const QCursor& cursor)
设置该 widget 光标的形状,仅在鼠标停留在该widget上时⽣效
QGuiApplication::setOverrideCursor(const QCursor& cursor)
设置全局光标的形状
对整个程序中的所有widget都会生效,覆盖 上面的 setCursor 设置的内容
注意:这里的全局指的是程序内的全局,而不是系统级别的全局
代码示例:在 Qt Designer 中设置按钮的光标
直接可以在界面上修改cursor的属性
![]()

代码设置光标
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QCursor cursor(Qt::WaitCursor);//等待状态的鼠标ui->pushButton_cursor->setCursor(cursor);
}Widget::~Widget()
{delete ui;
}
Ctrl + 左键点击Qt::WaitCursor 跳转到源码即可看到:系统内置的光标形状

Qt还允许我们通过自定义的方式来设置光标
先准备一张图片,把图片导入到项目中(qrc管理),在代码中访问到这个图片,基于这个图片来构造出光标对象并设置。

切换到编辑界面,访问图片,可以用QPixmap表示一个图片
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//访问到图片文件QPixmap pixmap(":/tupian.png");QCursor cursor(pixmap);ui->pushButton_cursor->setCursor(cursor);
}Widget::~Widget()
{delete ui;
}
在默认情况下 ,鼠标点击时相当于图片的左上角在进行点击,如果要修改可以在构造函数时修改
QCursor cursor(pixmap,10,10);10,10是热点所在位置,以图片左上角0,0为原点,找到10,10这个位置作为鼠标真正的点击位置

font
font()
获取当前widget的字体信息,返回 QFont 对象
setFont(const QFont& font)
设置当前widget的字体信息
关于QFont类
family
字体家族,比如"楷体","宋体","微软雅黑"等
pointSize
字体大小
weight
字体粗细。以数值方式表示粗细程度取值范围为[0,99],数值越大越粗
bold
是否加粗。设置为true,相当于weight为75;设置为false相当于weight为50
italic
是否倾斜
underline
是否有下划线
strikeOut
是否有删除线
在界面上直接编辑font属性
先把一个label拖过去

选中label在其右下角属性栏中有font属性,直接修改即可

如果是程序运行过程中要修改文字属性就得通过代码来完成
#include "widget.h"
#include "ui_widget.h"
#include<QLabel>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLabel* label = new QLabel(this);label->setText("测试代码使用font的文本");//创建字体对象QFont font;font.setFamily("仿宋");font.setPixelSize(30);font.setBold(true);font.setItalic(true);font.setUnderline(true);font.setStrikeOut(true);//把font对象设置到label中label->setFont(font);
}Widget::~Widget()
{delete ui;
}
toolTip
当一个GUI程序,界面比较复杂的,按钮啥的很多,当你把鼠标悬停到某个控件的时候就能弹出一个提示。
setToolTip
设置toolTip,鼠标悬停在该widget上时会有提示说明(设置提示的内容)
setToolTipDuring
设置toolTip 提示的时间,单位 ms。
时间到后 toolTip 自动消失
代码:设置按钮的toolTip
#include "widget.h"
#include "ui_widget.h"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);
}Widget::~Widget()
{delete ui;
}
focusPolicy
设置控件获取到焦点的策略。比如某个控件能否用鼠标选中或者能否通过 tab 键选中
所谓 "焦点" ,指的就是能选中这个元素。
界面上有一个输入框,此时必须选中这个输入框,接下来键盘的输入才会输入到输入框中,如果选中的是别的控件或者别的窗口,此时键盘的输入就不会进入输入框中。
接下来的操作(比如键盘操作),就都是针对该焦点元素进行的了。
这个对于 输⼊框, 单选框, 复选框等控件非常有用的。
"焦点" 用即时战略游戏来解释就是先选中某个单位(兵种、建筑啥的),然后对这个单位进行操作。
一般来说,一个控件获取到焦点有两种方式:
1、鼠标点击 2、键盘的tab
focusPolicy()
获取该 widget 的 focusPolicy。返回 Qt::FocusPolicy
setFocusPolicy(Qt::FocusPolicy policy)
设置 widget 的 focusPolicy
Qt::FocusPolicy 是一个枚举类型,取值如下
Qt::NoFocus :控件不会接收键盘焦点
Qt::TabFocus :控件可以通过Tab键接收焦点
Qt::ClickFocus :控件在鼠标点击时接收焦点
Qt::StrongFocus :控件可以通过Tab键和鼠标点击接收焦点(默认值)
Qt::WheelFocus :类似于Qt::StrongFocus 。同时控件也通过鼠标滚轮获取到焦点(新增的选项,一般很少使用)
理解不同的focusPolicy
在界面上创建四个单行输入框(Line Edit)

现在每个输入框都可以被鼠标或者TAB选中并输入内容

修改四个框的focusPolicy 属性,第一个为Qt::StrongFocus
![]()
第二个为Qt::NoFocus

第三个为Qt::TabFocus
![]()
修改第四个为Qt::ClickFocus
![]()
第一个现在既可以被鼠标又可以被TAB选中,第二个无法选中,第三个只能用tab选中,第四个只能用鼠标选中。

styleSheet
通过CSS设置widget的样式
所谓"样式",包括不限于大小,位置,颜色,间距,字体,背景,边框等(描述界面具体是啥样子的)
CSS (Cascading Style Sheets 层叠样式表)属于属于前端技术。主要就是用来描述界面的 样式
CSS中可以设置的样式属性非常多。基于这些属性Qt只能支持其中⼀部分,称为QSS
代码⽰例:
设置文本样式
界面上创建一个label,然后label右下角属性栏找到styleSheet

右边有三个点,点击此控件会显示以下界面去编辑样式表

当然,也可以直接右键文本框,选中改变样式表

同样也是编辑样式表界面

此处的语法格式同CSS,使用键值对的方式设置样式。其中键和值之间使用 : 分割。键值对之间使用 ; 分割。

代码示例:
通过代码切换样式,实现一个"夜间模式" 功能。
在界面上创建⼀个多行输入框Text Edit或者 Plain Text Edit 和两个按钮

编写代码(两个槽函数)
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_light_clicked()
{this->setStyleSheet("background-color:white;");//输入框的样式ui->plainTextEdit->setStyleSheet("background-color:white;color:black;");//按钮样式ui->pushButton_light->setStyleSheet("color:black;");ui->pushButton_dark->setStyleSheet("color:black;");
}void Widget::on_pushButton_dark_clicked()
{//窗口this->setStyleSheet("background-color:black;");//输入框ui->plainTextEdit->setStyleSheet("background-color:black;color:white;");//按钮颜色ui->pushButton_light->setStyleSheet("color:white;");ui->pushButton_dark->setStyleSheet("color:white;");}千万注意这里的单词拼写:如果拼写出错,不会有任何报错但是样式会不生效。

日间模式和最开始的模式的颜色有些不同

日间模式的背景是纯白的,而最开始是稍微带点灰色的那种颜色

CSS/QSS中是可以直接使用单词来设置颜色的。
关于计算机中的颜色表示
计算机中使用"像素"表示屏幕上的⼀个基本单位(也就是⼀个发亮的光点)。
每个光点都使⽤三个字节表示颜色,分别是R(red),G(green),B(blue)⼀个字节表示(取值范围是0-255,或者0x00-0xFF)
