界面优化 - 控件样式示例

目录

一、样式属性

1. 盒模型 (Box Model)

二、控件样式示例

1. 按钮

2. 复选框

3. 单选框

4. 输入框

5. 列表

6. 菜单栏

7. 登录界面


一、样式属性

1. 盒模型 (Box Model)

在文档 Customizing Qt Widgets Using Style SheetsThe Box Model 章节介绍了盒模型.

一个遵守盒模型的控件, 由上述几个部分构成.

  • Content 矩形区域: 存放控件内容. 比如包含的文本/图标等.
  • Border 矩形区域: 控件的边框.
  • Padding 矩形区域: 内边距. 边框和内容之间的距离.
  • Margin 矩形区域: 外边距. 边框到控件 geometry 返回的矩形边界的距离

默认情况下, 外边距, 内边距, 边框宽度都是 0.

可以通过一些 QSS 属性来设置上述的边距和边框的样式.

QSS 属性说明
margin设置四个方向的外边距. 复合属性.
padding设置四个方向的内边距. 复合属性.
border-style设置边框样式
border-width边框的粗细
border-color边框的颜色
border复合属性, 相当于 border-style + border-width + border-color

代码示例: 设置边框和内边距

1) 在界面上创建一个 label

2) 修改 main.cpp, 设置全局样式

  • border: 5px solid red 相当于 border-style: solid; border-width: 5px; border-color: red; 三个属性的简写形式.
  • padding-left: 10px; 是给左侧设置内边距.
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString style = "";
    style += "QLabel { border: 5px solid red; padding-left: 10px; }";
    a.setStyleSheet(style);

    Widget w;
    w.show();
    return a.exec();
}

3) 运行程序, 可以看到样式发生了变化


代码示例: 设置外边距

为了方便确定控件位置, 演示外边距效果, 我们使用代码创建一个按钮.

1) 修改 widget.cpp, 创建按钮, 并设置样式.

#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton* button = new QPushButton(this);
    button->setGeometry(0, 0, 100,100);
    button->setText("按钮");
    button->setStyleSheet("QPushButton { border: 5px solid green; margin: 20px; }");

    const QRect& rect = button->geometry();
    qDebug() << rect;

}

2) 运行程序, 可以看到, 当前按钮的边框被外边距挤的缩小了. 但是获取到的按钮的 Geometry 是不变的.

二、控件样式示例

1. 按钮

代码示例: 自定义按钮

1) 界面上创建一个按钮

 2) 右键 -> 改变样式表, 使用 Qt Designer 设置样式

QPushButton{
	font-size : 20px;
	border-radius : 10px;
	border : 5px solid rgb(0, 255, 127);
	background-color : rgb(78, 253, 255)
}

QPushButton:pressed{
	background-color : rgb(85, 170, 255)
}

3) 执行程序, 可以看到效果

 属性小结:

属性说明
font-size设置文字大小.
border-radius设置圆角矩形. 数值设置的越大, 角就 "越圆".
background-color设置背景颜色.

2. 复选框

代码示例: 自定义复选框

1) 创建⼀个 resource.qrc 文件, 并导入以下图片.

使用黑色作为默认形态.

使用天蓝色作为 hover 形态.

使用蓝色作为 pressed 形态.

  • 注意这里的文件命名

使用 阿里矢量图标库,  可以下载到上述图片.下载的时候可以手动选择颜色.

 2) 创建⼀个复选框

3) 编辑复选框的样式

QCheckBox {
	font-size: 50px;
}

QCheckBox::indicator {
	width: 50px;
	height: 50px;
}

QCheckBox::indicator:unchecked {
	image: url(:/checkbox-unchecked.png);
}

QCheckBox::indicator:unchecked:hover {
	image: url(:/checkbox-unchecked_hover.png);
}

QCheckBox::indicator:unchecked:pressed {
	image: url(:/checkbox-unchecked_pressed.png);
}

QCheckBox::indicator:checked {
	image: url(:/checkbox-checked.png);
}
QCheckBox::indicator:checked:hover {
	image: url(:/checkbox-checked _hover.png);
}

QCheckBox::indicator:checked:pressed {
	image: url(:/checkbox-checked_pressed.png);
}

4) 运行程序, 可以看到此时的复选框就变的丰富起来了.(此处截图看不出来效果)

 属性小结:

要点说明
::indicator子控件选择器. 选中 checkbox 中的对钩部分.
:hover

伪类选择器.

选中鼠标移动上去的状态.

:pressed

伪类选择器.

选中鼠标按下的状态.

:checked

伪类选择器.

选中 checkbox 被选中的状态.

:unchecked

伪类选择器.

选中 checkbox 未被选中的状态.

width

设置子控件宽度.

对于普通控件无效 (普通控件使用 geometry 方式设定尺寸).

height

设置子控件高度.

对于普通控件无效 (普通控件使用 geometry 方式设定尺寸).

image

设置子控件的图片.

像 QSpinBox, QComboBox 等可以使用这个属性来设置子控件的图片.

3. 单选框

代码示例: 自定义单选框

1) 创建 resource.qrc 文件, 并导入以下图片.

使用黑色作为默认形态.

使用蓝色作为 hover 形态.

使用红色作为 pressed 形态.

  • 注意这里的文件命名.

2) 在界面上创建两个单选按钮

3) 在 Qt Designer 中编写样式

  • 此处为了让所有 QRadioButton 都能生效, 把样式设置在 Widget 上了. 并且使用后代选择器选中了 QWidget 里面的 QRadioButton .
QWidget QRadioButton {
	font-size: 20px;
}

QWidget QRadioButton::indicator {
	width: 20px;
	height: 20px;
}

QWidget QRadioButton::indicator:unchecked {
	image: url(:/radio-unchecked.png);
}

QWidget QRadioButton::indicator:unchecked:hover {
	image: url(:/radio-unchecked_hover.png);
}

QWidget QRadioButton::indicator:unchecked:pressed {
	image: url(:/radio-unchecked_pressed.png);
}

QWidget QRadioButton::indicator:checked {
	image: url(:/radio-checked.png);
}

QWidget QRadioButton::indicator:checked:hover {
	image: url(:/radio-checked_hover.png);
}

QWidget QRadioButton::indicator:checked:pressed {
	image: url(:/radio-checked_pressed.png);
}

 4) 运行程序, 观察效果

属性小结:

要点说明
::indicator

子控件选择器.

选中 radioButton 中的对钩部分.

:hover

伪类选择器.

选中鼠标移动上去的状态.

:pressed

伪类选择器.

选中鼠标按下的状态.

:checked

伪类选择器.

选中 radioButton 被选中的状态.

:unchecked

伪类选择器.

选中 radioButton 未被选中的状态.

width

设置子控件宽度.

对于普通控件无效 (普通控件使用 geometry 方式设定尺寸).

height

设置子控件高度.

对于普通控件无效 (普通控件使用 geometry 方式设定尺寸).

image

设置子控件的图片.

像 QSpinBox, QComboBox 等可以使用这个属性来设置子控件的图片.

4. 输入框

代码示例: 自定义单行编辑框

1) 在界面上创建⼀个单行编辑框

2) 在 Qt Designer 中编写样式.

QLineEdit {
	border-width: 1px;
	border-radius: 10px;
	border-color: rgb(58, 58, 58);
	border-style: inset;
	padding: 0 8px;
	color: rgb(255, 255, 255);
	background:rgb(100, 100, 100);
	selection-background-color: rgb(187, 187, 187);
	selection-color: rgb(60, 63, 65);
}

3) 执行程序观察效果.

属性小结:

属性说明
border-width设置边框宽度.
border-radius设置边框圆角.
border-color设置边框颜色.
border-style设置边框风格.
padding设置内边距.
color设置文字颜色.
background设置背景颜色.
selection-background-color设置选中文字的背景颜色.
selection-color设置选中文字的文本颜色.

5. 列表

代码示例: 自定义列表框

1) 在界面上创建⼀个 ListWidget

 2) 编写代码

QListView::item:hover {
	background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
				stop: 0 #FAFBFE, stop: 1 #DCDEF1);
}

QListView::item:selected {
	border: 1px solid #6a6ea9;
	background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
				stop: 0 #6a6ea9, stop: 1 #888dd9);
}

3) 执行程序, 观察效果

属性小结: 

要点说明
::item选中 QListView 中的具体条目.
:hover选中鼠标悬停的条目
:selected选中某个被选中的条目.
background设置背景颜色
border设置边框.
qlineargradient设置渐变色.

关于 qlineargradient:

qlineargradient 有 6 个参数.

  • x1, y1: 标注了⼀个起点.
  • x2, y2: 标注了⼀个终点.
  • 这两个点描述了⼀个 "方向".

例如:

  • x1: 0, y1: 0, x2: 0, y2: 1 就是垂直方向从上向下 进行颜色渐变.
  • x1: 0, y1: 0, x2: 1, y2: 0 就是水平方向从左向右 进行颜色渐变.
  • x1: 0, y1: 0, x2: 1, y2: 1 就是从左上往右下方向 进行颜色渐变.

stop0 和 stop1 描述了两个颜色. 渐变过程就是从 stop0 往 stop1 进行渐变的.


代码例子: 理解渐变色

1) 界面不创建任何控件

2) 编写样式

QWidget {
        background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop: 0 #fff,stop: 1 #000);
}
  • 当前按照 垂直从上往下 从 白色 过渡到 黑色

3) 修改代码

QWidget {
	background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 #fff, stop: 1 #000);
}
  • 当前按照 水平从左往右 从 白色 过渡到 黑色

6. 菜单栏

代码示例: 自定义菜单栏

1) 创建菜单栏

  • 创建若干菜单项和一个分隔符.

2) 编写样式

QMenuBar {
	background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
					stop:0 lightgray, stop:1 darkgray);
	spacing: 3px; /* spacing between menu bar items */
}

QMenuBar::item {
	padding: 1px 4px;
	background: transparent;
	border-radius: 4px;
}

QMenuBar::item:selected { /* when selected using mouse or keyboard */
	background: #a8a8a8;
}

QMenuBar::item:pressed {
	background: #888888;
}

QMenu {
	background-color: white;
	margin: 0 2px; /* some spacing around the menu */
}
QMenu::item {
	padding: 2px 25px 2px 20px;
	border: 3px solid transparent; /* reserve space for selection border */
}

QMenu::item:selected {
	border-color: darkblue;
	background: rgba(100, 100, 100, 150);
}

QMenu::separator {
	height: 2px;
	background: lightblue;
	margin-left: 10px;
	margin-right: 5px;
}

3) 执行程序, 观察效果

属性小结:

要点说明
QMenuBar::item选中菜单栏中的元素.
QMenuBar::item:selected选中菜单来中的被选中的元素.
QMenuBar::item:pressed选中菜单栏中的鼠标点击的元素.
QMenu::item选中菜单中的元素
QMenu::item:selected选中菜单中的被选中的元素.
QMenu::separator选中菜单中的分割线.

7. 登录界面

1) 在界面上创建元素

2) 使用布局管理器, 把上述元素包裹一下.

  • 使用 QVBoxLayout 来管理上述控件.
  • 两个输入框和按钮的 minimumHeight 均设置为 50. (元素在布局管理器中无法直接设置 width 和height, 使用 minimumWidth 和 minimumHeight 代替, 此时垂直方向的 sizePolicy 要设为 fixed).
  • 右键 QCheckBox , 选择 Layout Alignment 可以设置 checkbox 的对齐方式(左对齐, 居中对齐, 右对齐).

 3) 设置背景图片.

  • 把上述控件添加一个父元素 QFrame, 并设置 QFrame 和 窗口一样大.

        顶层窗口的 QWidget 无法设置背景图片. 因此我们需要再套上一层 QFrame. 背景图片就设置到 QFrame 上即可.

创建 resource.qrc, 并导入图片

编写 QSS 样式.

  • 使用 border-image 设置背景图片, 而不是 background-image . 主要是因为 borderimage 是可以自动缩放的. 这一点在窗口大小发生改变时是非常有意义的.
QFrame {
    border-image: url(:/cat.jpg);
}

此时效果为:

4) 设置输入框样式

  • 编写 QSS 代码
QLineEdit {
    color: #8d98a1;
    background-color: #405361;
    padding: 0 5px;
    font-size: 20px;
    border-style: none;
    border-radius: 10px;
}

运行程序效果: 

 

5) 设置 checkbox 样式

  • 背景色使用 transparent 表示完全透明 (应用父元素的背景).
QCheckBox {
    color: white;
    background-color: transparent;
}

 运行程序效果: 

6) 设置按钮样式

QPushButton {
    font-size: 20px;
    color: white;
    background-color: #555;
    border-style: outset;
    border-radius: 10px;
}
QPushButton:pressed {
    color: black;
    background-color: #ced1db;
    border-style: inset;
}

执行程序

最终完整样式代码: 

QFrame {
	border-image: url(:/cat.png);
}

QLineEdit {
    color: #8d98a1;
    background-color: #405361;
    padding: 0 5px;
    font-size: 20px;
    border-style: none;
    border-radius: 10px;
}

QCheckBox {
    color: white;
    background-color: transparent;
}

QPushButton {
    font-size: 20px;
    color: white;
    background-color: #555;
    border-style: outset;
    border-radius: 10px;
}

QPushButton:pressed {
    color: black;
    background-color: #ced1db;
    border-style: inset;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值