风格
使用特定平台的风格
预览
在ui设计界面中,按下列点击,可选择对应的风格预览
使用
在main函数中加入头文件<QStyleFactory>
QApplication a(argc, argv)后添加:
a.setStyle(QStyleFactory::create(“fusion”));
括号里是想用的风格
对特定部件使用特定风格,调用setStyle方法,参数同上
调色板
Qt的所有部件都包含一个调色板,用于绘制自身,常用setColor()和setBrush()
常用部件的palette()获取调色板,setPalette(调色板)设置
调色板有下三种颜色组:
- 激活颜色组QPalette::Active:获取键盘焦点的窗口
- 非激激活颜色组QPalette::Inactive:没有获取键盘焦点的窗口
- 失效颜色组QPalette::Disabled:不可用的非窗口部件
setColor有两种:
void QPalette::setColor(QPalette::ColorGroup group, QPalette::ColorRole role, const QColor &color)
void QPalette::setColor(QPalette::ColorRole role, const QColor &color)
颜色组为上三种,颜色角色可在Qt文档中查看
例:
//通过QBrush使用图片
QBrush brush(QPixmap(":/img/C:/Users/Pambe/Pictures/ali.jpg"));
QPalette palette = this->palette();
palette.setBrush(QPalette::Window, brush);
this->setPalette(palette);
QPalette palette1 = ui->pushButton->palette();
palette1.setColor(QPalette::ButtonText, Qt::red);
//获取和设置部件的palette后还要调用组件的setPalette方法,我也很奇怪
ui->pushButton->setPalette(palette1);
ui->spinBox->setDisabled(true);
QPalette palette2 = ui->spinBox->palette();
//禁用状态下的spinBox
palette2.setColor(QPalette::Disabled, QPalette::Base, Qt::blue);
ui->spinBox->setPalette(palette2);
样式表
代码实现
一个自定义部件外观的机制,十分强大。
如果不同级别都设置了样式表,Qt会使用所有有效的样式表,被称为样式表的折叠。
常用setStyleSheet()方法
//设置按钮背景为黄色
ui->pushButton->setStyleSheet("background:yellow");
//对后续所有加入的QSlider的背景颜色都更改为蓝色
setStyleSheet("QSlider{background:blue}");
setStyleSheet()括号里的参数其实是一种类似CSS的语法(选择器,见下章)
设计模式实现
在设计模式中右键,选择Change styleSheet,可在其中输入样式表语法或选择其中提供的功能进行设置
Qt样式表语法
样式规则
每个样式规则由选择器和声明组成,例:
Qt样式表中只有类名、对象名、Qt属性名区分大小写。
多个选择器用逗号隔开,多个属性:值用分号隔开,如:
QPushButton,QSlide{color:red;background-color:white}
Qt帮助文档“Qt Style Sheets Reference”可查看样式表所支持的所有部件及属性。
选择器类型
https://blog.csdn.net/wasaiheihei/article/details/122538838
这个博主写得全
子控件
多用于复杂的部件修改,如访问某控件的上下按钮,参考
https://blog.csdn.net/Staranywhere/article/details/106652678
伪状态
部件在指定状态下应用修改,如鼠标悬停。伪状态在选择器后用冒号隔开,如
QPushButton:hover{color:white}
也可使用逻辑否(!)
QPushButton:!hover{color:red}
即在非悬停状态
多个伪状态可用冒号或逗号隔开,如:
QPushButton:hover:checked{color:white}
或QPushButton:hover, QCheckBox:checked{color:white}
可联合子控件使用
QCombox::drop-down:hover{color:white}
冲突解决
当多个规则针对同一部件时,并不像CSS后出现的代码覆盖前面的,而是特殊的选择器优先。
如ID选择器大于一半选择器,有伪状态优先无伪状态。
同特殊性时后出现的覆盖先出现。
层叠
部件最后的效果是部件祖先的样式表合并得到的,当发生冲突式,部件样式表 > 父部件样式表 > 祖先部件样式表
设置QObject属性
任何可设计的Q_PROPERTY都可使用“qproperty-属性名”语法设置样式表,如:
QPushButton{qproperty - iconSize : 20px 20px}
盒子模型
默认间距为0
QSS文件
Qt编写的样式表可保存为.qss文件或利用QFile导入.qss文件作为界面样式
QFile *qssFile = new QFile(":/my.qss", this);
qssFile->open(QFile::ReadOnly);
QString style = QString(qssFile->readAll());
qApp->setStyleSheet(style);
qssFile->close();
实际是读取文件内容,将预先设计的样式利用setStyleSheet()进行修改
特殊效果窗体
不规则窗体
利用mask将目标切割成与图片一致的形状
QPixmap pixmap(":/img/C:/Users/Pambe/Pictures/ali.jpg");
ui->label->resize(pixmap.size());
ui->label->setPixmap(pixmap);
ui->label->setMask(pixmap.mask());
透明窗体
对于非顶级窗体,利用样式表的rgba(255, 255, 255, 100),最后一项为alpha,取值也为0~255,理解为透明度
对于顶级窗体,利用setWindowOpacity()函数,参数为0.0~1.0,设置透明度。缺点是该方法会设置所有窗口/部件的透明度。
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
上两个方法可设置只顶级窗口半透明,但标题栏没了,需额外添加。