【Qt】界面优化
界面优化
- 设置全局样式
- 样式文件
- 使⽤ Qt Designer 编辑样式
- 选择器
- 设置子控件样式
- 伪类选择器
- 样式属性
- 盒模型
- 设置按钮样式
- 设置复选框样式
- 输入框样式
- 列表样式
- 菜单栏样式
在 Qt 中对界面的优化和 CSS 类似。语法结构如下:
选择器 {
属性名: 属性值;
}
例如:
QPushButton { color: red; }
或
QPushButton {
color: red;
}
上述代码表示,将界面上的 QPushButton 的文本设置为红色。
下面的代码指定一个按钮,通过使用 setStyleSheet 的方式设置样式:
若要设置两个按钮的样式,可设置其父控件的样式,也就是 widget(指定控件设置样式后,该控件的子控件也会改变)
设置全局样式
直接看例子,在 main.cpp 中设置:
若设置了全局样式(设置字体颜色),并在某个控件里设置了其他样式(设置字体大小),两者不冲突则会叠加。
若设置了全局样式(设置字体颜色),并在某个控件里设置了其他样式(设置字体颜色),两者冲突则优先后者。
样式文件
上述方式都是简单的设置控件样式,若控件很多或样式很多,则不能更好的维护。更好的做法是把样式放到单独的文件中,通过读取文件的方式加载样式。
- 创建 qrc 文件,通过 qrc 管理样式文件:
- 创建单独的 qss 文件,把这样的文件放到 qrc 中:
- 编写 C++ 代码,读取 qss 文件中的内容,并设置样式:
前面和设置图标时步骤一样,add files 时,在弹出的对话框右键创建 style.qss 文件
打开 style.qss,并编写代码:
读取样式文件并设置全局样式:
使⽤ Qt Designer 编辑样式
Qt 提供了一种更便捷的方式来编辑样式:
选择器
加粗为常用
选择器 | 示例 | 说明 |
---|---|---|
全局选择器 | * | 选择所有的 widget. |
类型选择器(type selector) | QPushButton | 选择所有的QPushButton和其子类的控件. |
类选择器(class selector) | .QPushButton | 选择所有的QPushButton的控件. 不会选择子类. |
ID选择器 | #pushButton_2 | 选择objectName 为 pushButton_2 的控件. |
后代选择器 | QDialog QPushButton | 选择QDialog的所有后代(子控件,孙子控件等等)中的QPushButton. |
子选择器 | QDialog>QPushButton | 选择QDialog的所有子控件中的QPushButton. |
并集选择器 | QPushButton, QLineEdit, QComboBox | 选择QPushButton, QLineEdit, QComboBox 这三种控件.(即接下来的样式会针对这三种控件都生效). |
属性选择器 | QPushButton[flat=“false”] | 选择所有QPushButton中, flat属性为false的控件. |
使用 ID 选择器:
使用并集选择器(并集选择器中也可以使用 ID 选择器,例如 “#pushButton, QLabel{}”):
设置子控件样式
可以通过帮助手册搜索 Qt Style Sheets Reference 查看具体的子控件:
在下方我们可以看到案例:
下面以修改 combox 子控件 down-arrow 样式为例(修改下拉图标):
同样先将图标添加到resource中,通过全局样式的方式修改:
伪类选择器
伪类选择器是根据控件所处的某个状态被选择的,例如按钮被按下,输入框获取到焦点,鼠标移动到某个控件上等。
当状态具备时,控件被选中,样式生效。
当状态不具备时,控件不被选中,样式失效。使用 :的方式定义伪类选择器。
常用的伪类选择器:
伪类选择器 | 说明 |
---|---|
:hover | 鼠标放到控件上 |
:pressed | 鼠标左键按下时 |
:focus | 获取输入焦点时 |
:enabled | 元素处于可用状态时 |
:checked | 被勾选时 |
:read-only | 元素为只读状态时 |
可以使用!取反,则 :!hover 就是鼠标离开控件时,:!pressed 就是鼠标松开时 等。
样式属性
QSS 中的样式属性非常多,可以到文档中 Qt Style Sheets Reference 章节查看。
盒模型
在参考文档中,提及了一个叫盒模型的东西:
以下是通过 QSS 属性设置上述边距和边框的样式:
QSS属性 | 说明 |
---|---|
margin | 设置四个方向的外边距,复合属性(可由多个组成,例如margin-left, margin-top等) margin: 10px 四个方向都是10px 外边距 margin: 10px 20px 上下是10px , 左右是 20px margin: 10px 20px 30px 40px 按顺时针方向,上右下左依次取值 |
padding | 设置四个方向的内边距,复合属性 |
border-style | 设置边框样式 |
border-width | 边框的粗细 |
border-color | 边框的颜色 |
border | 复合属性,相当于 border-style + border-width + border-color |
设置按钮样式
还可以通过 QPushButton::pressed 设置鼠标按下去的样式
设置复选框样式
属性 | 说明 |
---|---|
::indicator | 子控件选择器. 选中checkbox中的对钩部分. |
hover | 伪类选择器. 选中鼠标移动上去的状态. |
pressed | 伪类选择器. 选中鼠标按下的状态. |
:checked | 伪类选择器. 选中checkbox被选中的状态. |
unchecked | 伪类选择器. 选中checkbox未被选中的状态. |
width / height | 设置子控件宽度 / 高度. 对于普通控件无效 (普通控件使用geometry方式设定尺寸). |
image | 设置子控件的图片. 像 QSpinBox, QComboBox 等可以使用这个属性来设置子控件的图片. |
输入框样式
列表样式
使用渐变色 qlineargradient:
菜单栏样式
- | 说明 |
---|---|
QMenuBar::item | 选中菜单栏中的元素 |
QMenuBar:item:selected | 选中菜单栏中的被选中的元素 |
QMenuBar::item:pressed | 选中菜单栏中的鼠标点击的元素 |
QMenu::item | 选中菜单中的元素 |
QMenu:item:selected | 选中菜单中的被选中的元素 |
QMenu::separator | 选中菜单中的分割线 |