Qt 常用控件 - 4
本文介绍了Qt中CSS样式表(QSS)的应用和按钮控件的使用。QSS基于CSS语法,可用于设置界面样式,但仅支持部分CSS属性。文章通过夜间模式切换示例展示了QSS的使用方法,包括颜色设置和样式切换。在按钮控件部分,详细介绍了QPushButton的特性,包括图标设置、快捷键绑定和重复触发功能,并通过一个方向控制按钮的实例演示了这些功能的具体实现。文中还解释了计算机中颜色的表示方法,为界面设计提供

Qt 常用控件 - 3
https://blog.csdn.net/Small_entreprene/article/details/149665911
关于 CSS 和 Qt Style Sheet (QSS)
-
CSS (Cascading Style Sheets 层叠样式表) 是网页前端技术,用于描述界面的样式,包括大小、位置、颜色、间距、字体、背景、边框等。丰富多彩的网页都大量使用了 CSS。
-
Qt 虽然是用于 GUI 开发的,但与网页前端有许多相似之处,因此也引入了对 CSS 的支持,称为 Qt Style Sheet (QSS)。不过,Qt 只能支持 CSS 中的一部分属性,具体支持情况可以参考 Qt 文档中的 "Qt Style Sheets Reference" 章节。

示例:设置文本样式
-
在界面上创建一个 label。
-
编辑右侧的 styleSheet 属性,设置样式。语法格式与 CSS 相同,使用键值对的方式设置样式,键和值之间用
:分割,键值对之间用;分割。Qt Designer 只能对样式的基本格式进行校验,不能检测出哪些样式不被 Qt 支持。例如,text-align: center这样的文本居中操作就不被支持。我们也可以鼠标右键指定控件,会有 --- 改变样式表。

-
编辑完成后,可以在 Qt Designer 中实时预览效果。运行程序后,实际效果和预览效果基本一致。

示例:实现切换夜间模式
-
在界面上创建一个多行输入框 (Text Edit) 或者 Plain Text Edit 和两个按钮,objectName 分别为
pushButton_light和pushButton_dark。
-
编写按钮的 slot 函数。使用颜色代码(如
#333表示深色但不是纯黑,#fff表示纯白,#000表示纯黑)来设置背景和文字颜色。可以使用在线调色板工具查看颜色代码,参考 在线调色板。 -
运行程序后,点击 "日间模式" 和 "夜间模式" 按钮,可以看到界面在浅色背景深色文字和深色背景浅色文字之间切换。
#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: balck; color: white");
//设置按钮样式
ui->pushButton_light->setStyleSheet("color: white");
ui->pushButton_dark->setStyleSheet("color: white");
}


可是我们执行程序的最开始的界面是:

CSS/QSS 中是可以直接使用单词来设置颜色的:white/black/red/green/blue/yellow/...
颜色是无数种的,我们尽量使用颜色代码来进行代码的设置!
void Widget::on_pushButton_light_clicked()
{
//背景色为亮色
//文本色为暗色
//设置样式
this->setStyleSheet("background-color: #6666FF");
//设置输入框样式
ui->plainTextEdit->setStyleSheet("background-color: #CCFFFF; color: #000000");
//设置按钮样式
ui->pushButton_light->setStyleSheet("color: #000000");
ui->pushButton_dark->setStyleSheet("color: #000000");
}
void Widget::on_pushButton_dark_clicked()
{
//背景色为亮色
//文本色为暗色
//设置样式
this->setStyleSheet("background-color: ##0066FF");
//设置输入框样式
ui->plainTextEdit->setStyleSheet("background-color: #000099; color: #FFFFFF");
//设置按钮样式
ui->pushButton_light->setStyleSheet("color: #FFFFFF");
ui->pushButton_dark->setStyleSheet("color: #FFFFFF");
}

关于计算机中的颜色表示
计算机中使用 "像素" 表示屏幕上的一个基本单位(一个发亮的光点)。每个像素使用三个字节表示颜色,分别是 R (red)、G (green)、B (blue),每个字节的取值范围是 0-255 或 0x00-0xFF。通过混合三种颜色的不同数值比例,可以搭配出各种颜色。例如:
-
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 色深等,情况会更加复杂。
前面部分就是 QWidget 的重要属性了,接下来,我们针对特定的某种控件进行更加丰富的学习和使用。
之前 QWidget 中涉及到的各种属性/函数/使用方法,针对接下来的要介绍的 Qt 的各种控件都是有效的!
按钮类控件
QPushButton
QPushButton 表示一个按钮,继承自 QAbstractButton,后者是一个抽象类,是其他按钮的父类。在 Qt Designer 中也可以看到这种继承关系。QAbstractButton 中与 QPushButton 相关性较大的属性如下:

| 属性 | 说明 |
|---|---|
| text | 按钮中的文本 |
| icon | 按钮中的图标 |
| iconSize | 按钮中图标的尺寸 |
| shortCut | 按钮对应的快捷键 --- 按下快捷键==点击按钮,触发事件,参数是 QKeySequence,是一个类,sequence 是顺序表,说明按下的快捷键,不一定是单个按键,也可以是组合键 |
| autoRepeat | 按钮是否会重复触发。当鼠标左键按住不放时,如果设为 true,则会持续产生鼠标点击事件;如果设为 false,则必须释放鼠标,再次按下鼠标时才能产生点击事件 |
| autoRepeatDelay | 重复触发的延时时间。按住按钮多久之后,开始重复触发 |
| autoRepeatInterval | 重复触发的周期 |
-
QAbstractButton作为QWidget的子类,继承了QWidget的属性,因此上述介绍的QWidget的各种属性用法,对于QAbstractButton同样适用。表格仅列出QAbstractButton独有的属性。 -
Qt 的 API 设计风格非常清晰,此处列出的属性都可以获取和设置。例如,使用
text()获取按钮文本;使用setText()设置文本。事实上,QPushButton的核心功能都是QAbstractButton提供的,自身提供的属性都比较简单。其中default和autoDefault影响的是按下 enter 时自动点击哪个按钮的行为;flat把按钮设置为扁平的样式。这里暂时不做过多关注。
示例:带有图标的按钮
图标:

-
创建
resource.qrc文件,并导入图片。具体操作步骤参见QWidget中的windowIcon部分。 -
在界面上创建一个按钮。
-
修改
widget.cpp,给按钮设置图标。
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建图标对象
QIcon icon(":/dog.png");
// 设置图标
ui->pushButton->setIcon(icon);
// 设置图标尺寸 --- 可选
ui->pushButton->setIconSize(QSize(50, 50));
}

示例:带有快捷键的按钮
-
在界面上拖五个按钮,objectName 分别为
pushButton_target、pushButton_up、pushButton_down、pushButton_left、pushButton_right。五个按钮的初始位置随意,其中pushButton_target尺寸设置为 100×100,其余按钮设为 50×50,文本内容均清空。 -
创建
resource.qrc,并导入 5 个图片。像这样的图片资源,可以在 阿里巴巴矢量图标库 中查找并免费下载。包含上面的dog(还有类似下面的图标)

-
修改
widget.cpp,设置图标资源和快捷键。

初始化操作:设置按钮图标
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置这些按钮的图标 --- 使用匿名函数
ui->pushButton_target->setIcon(QIcon(":image/dog.png"));
ui->pushButton_target->setIconSize(QSize(80, 80));
ui->pushButton_up->setIcon(QIcon(":image/up.png"));
ui->pushButton_up->setIconSize(QSize(50, 50));
ui->pushButton_down->setIcon(QIcon(":image/down.png"));
ui->pushButton_down->setIconSize(QSize(50, 50));
ui->pushButton_left->setIcon(QIcon(":image/left.png"));
ui->pushButton_left->setIconSize(QSize(50, 50));
ui->pushButton_right->setIcon(QIcon(":image/right.png"));
ui->pushButton_right->setIconSize(QSize(50, 50));
// // 设置对应的快捷键
// ui->pushButton_up->setShortcut(QKeySequence("w"));
// ui->pushButton_down->setShortcut(QKeySequence("s"));
// ui->pushButton_left->setShortcut(QKeySequence("a"));
// ui->pushButton_right->setShortcut(QKeySequence("d"));
//也可以这么写
ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W));
//ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));
ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));
ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));
ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));
}

修改 widget.cpp,设置四个方向键的 slot 函数。
void Widget::on_pushButton_up_clicked()
{
// 获取到 target 的位置
QRect rect = ui->pushButton_target->geometry();
// 基于上次的位置,设置新的位置
ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());
}
void Widget::on_pushButton_down_clicked()
{
// 获取到 target 的位置
QRect rect = ui->pushButton_target->geometry();
// 基于上次的位置,设置新的位置
ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());
}
void Widget::on_pushButton_left_clicked()
{
// 获取到 target 的位置
QRect rect = ui->pushButton_target->geometry();
// 基于上次的位置,设置新的位置
ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}
void Widget::on_pushButton_right_clicked()
{
// 获取到 target 的位置
QRect rect = ui->pushButton_target->geometry();
// 基于上次的位置,设置新的位置
ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());
}
运行程序,此时点击按钮,或者使用 wasd 均可让目标按钮移动。

示例:按钮的重复触发
在上述案例中,按住快捷键是可以进行重复触发的,但鼠标点击则不能。修改 widget.cpp,在构造函数中开启重复触发。
// 开启重复触发
ui->pushButton_up->setAutoRepeat(true);
ui->pushButton_down->setAutoRepeat(true);
ui->pushButton_left->setAutoRepeat(true);
ui->pushButton_right->setAutoRepeat(true);
此时,按住鼠标时,即可让目标按钮连续移动。
更多推荐

所有评论(0)