按钮动态切换图片
最近做了有关控件动态贴图的功能,用到了样式表(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);
}
效果图