qt 动态属性应用到样式表

这篇博客介绍了如何在Qt环境中使用样式表(QSS)动态改变QPushButton的背景颜色和图标。通过设置按钮的pressed属性,结合QEvent监听鼠标按下和释放事件,实现在不同状态下切换不同图片。此外,还展示了利用属性设置和样式表更新来实现控件美化的方法。
摘要由CSDN通过智能技术生成

按钮动态切换图片

最近做了有关控件动态贴图的功能,用到了样式表(qss),结合属性可以方便、简洁的做美化工作。

测试环境:Win10 + Qt5.14.2 + msvc2017

先看一下QLabel设置文本的方式:

QLabel label;
//1、通过QLabel接口。
label.setText("Microsoft YAHei UI");
//2、属性设置。简单说一下,这里text是QLabel已经注册好的属性,我们可以直接用
// 另外,如果是自定义的属性,qt会存储这对key-value,我们也可以
// 获取到该值
label->setProperty("text", "Microsoft YAHei UI");
//3、样式表。该方法应该是Qt内部读取text属性,这三种方法本质应该都是一样的
//(原谅没怎么读过源码)。如果是动态使用,需要showEvent之后,在构造函数里
// 使用无效
label->setStyleSheet("qproperty-text:\"Microsoft YAHei UI\";");

效果图如下:

在这里插入图片描述

动态属性使用示例

QPushButton[pressed=false] {
	background-color: lightyellow;
	border: none;
	qproperty-icon: url(:/FramelessWindows/images/arrow-left.png);
	qproperty-iconSize: 20px;
}

QPushButton[pressed=true] {
	background-color: lightyellow;
	border: none;
	qproperty-icon: url(:/FramelessWindows/images/arrow-left-light.png);
	qproperty-iconSize: 20px;
}

QPushButton:hover {
	background-color: yellow;
}

QPushButton:hover:pressed {
	background-color: blue;
}

首先确认pressed属性未被注册,在点击按钮时切图,然后再按钮点击事件中设置该属性值(这里自定义为bool,可以是其它值,参考QVariant)。

{//构造函数
	...
	// 初始化pressed 值为false,代表没有点击
	ui.bt_maxmize->setProperty("pressed", false);
	// 安装事件过滤器到当前窗口
	ui.bt_maxmize->installEventFilter(this);
	...
}

bool CWindow::eventFilter(QObject* watched, QEvent* ev) {
	...
	if (watched == ui.bt_maxmize) {
    if (ev->type() == QEvent::MouseButtonPress) {
    	// 方法1:取消样式表的 qproperty-icon 设置,直接设置icon及尺寸
      /*ui.bt_maxmize->setIcon(QIcon(":/FramelessWindows/images/arrow-left-light.png"));
      ui.bt_maxmize->setIconSize(QSize(20, 20));*/

		// 方法2:通过属性设置,这种方法更整齐一致
      ui.bt_maxmize->setProperty("pressed", true);
      // 重新装载样式
      /*ui.bt_maxmize->style()->unpolish(ui.bt_maxmize);
      ui.bt_maxmize->style()->polish(ui.bt_maxmize);*/
      // 这里一部到位
      ui.bt_maxmize->setStyle(qApp->style());
      
      ui.bt_maxmize->update();

    } else if (ev->type() == QEvent::MouseButtonRelease) {
      /*ui.bt_maxmize->setIcon(QIcon(":/FramelessWindows/images/arrow-left.png"));
      ui.bt_maxmize->setIconSize(QSize(20, 20));*/

      ui.bt_maxmize->setProperty("pressed", false);
      /*ui.bt_maxmize->style()->unpolish(ui.bt_maxmize);
      ui.bt_maxmize->style()->polish(ui.bt_maxmize);*/
      ui.bt_maxmize->setStyle(qApp->style());
      
      ui.bt_maxmize->update();
    }
  }
	...
	return __super::eventFilter(watched, obj);
}

效果图
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值