Qt样式基础

使用Qt做样式定制,经常会使用QSS对控件UI进行美化,但使用过程中会遇到很多的细节,这里摘取一二记录备忘。

问题一、自定义窗体(继承自QWidget)样式表不生效:

原因:qss样式需要通过paint才能正常绘制到控件表面,而QWidget的paintEvent()是空的,这就要求我们在继承QWidget的时候重载paintEvent()。 如下所示:

cpp 复制代码
//If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:

  void CustomWidget::paintEvent(QPaintEvent *)
  {
      QStyleOption opt;
      opt.init(this);
      QPainter p(this);
      style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
  }

//The above code is a no-operation if there is no stylesheet set

说明:当然,如果使用QFrame代替QWidget,也就是说自定义窗体继承自QFrame(并且带有框架属性),则qss样式是可以生效的。

问题二:如何在运行时动态的改变控件的样式?

解决方案:

1)我们可以在代码中动态的设置控件的objectName (相当于QSS样式的选择器). 但使用setObjectName方法后,会发现控件的样式并没有实时的刷新,这就需要我们手动的 setStyle 让控件动态的改变qss样式。 如下所示:

cpp 复制代码
void GBAUtils::resetStyleSheet(QWidget *w)
{
    //w->style()->unpolish(w); //清除旧的样式
    //w->style()->polish(w);   //更新为新的样式
    w->setStyle(w->style());
}

参考文章:

qt中动态变更objectname来动态变动控件样式_setobjectname qt 马上更新_雨田嘟嘟的博客-CSDN博客

Qt的qss通过动态属性来改变样式_qt更新样式_c1s2d3n4cs的博客-CSDN博客

相关推荐
LuminousCPP25 分钟前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.088899935 分钟前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you1 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
MY_TEUCK2 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
测试员周周2 小时前
【Appium 系列】第13节-混合测试执行器 — API + UI 的协同执行
开发语言·人工智能·python·功能测试·ui·appium·pytest
光泽雨3 小时前
c#中的Type类型
开发语言·前端
见叶之秋3 小时前
C++基础入门指南
开发语言·c++
计算机安禾3 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
qq_401700413 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt
玖釉-4 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法