[Qt]如何支持:自定义小部件样式表的按下状态?

Posted

技术标签:

【中文标题】[Qt]如何支持:自定义小部件样式表的按下状态?【英文标题】:[Qt]How to support :pressed state of style sheet for custom widget? 【发布时间】:2013-08-08 20:18:45 【问题描述】:

我有什么:-

我有一个扩展 QFrame 的自定义小部件(而不是 QWidget,因为 QFrame 已经有一个工作的paintEvent 实现)。我已经覆盖了 mousePressed() 和 mouseReleased() 以发出按下的() 释放() 和 clicked() 信号。到目前为止,一切正常。

我需要什么:-

这个自定义小部件具有基本的样式表支持,并且很好地支持 :hover 状态。 但是 :pressed 状态不起作用。我已经发现这是因为 QFrame/QLabel 等不支持它。 我想知道我需要做什么来支持 :pressed 状态。 我应该在按下和释放或其他任何东西上设置一些属性/属性吗?

【问题讨论】:

快速提问。使用 QFrame 代替 QPushButton、QToolButton 或 QAbstractButton 作为基类有什么特别的原因吗? 是的。我需要能够向其中添加更多小部件并设置 QFrame 支持良好的布局 【参考方案1】:

您可以将属性设置为您的QLabel(或您正在使用的任何小部件)并更改该属性的值。然后在样式表中使用该属性。

例子:

this->setStyleSheet("*[myproperty=\"true\"]  background-color: red ");
d_label = new QLabel("dynamic label", this);
d_label->setProperty("myproperty", false);

然后在 mousePressEvent 中设置,在 mouseReleaseEvent 中取消设置该属性:

d_label->setProperty("myproperty", true); // or false when you wish to unset it
style()->unpolish(d_label);
style()->polish(d_label); // force a stylesheet recomputation

【讨论】:

我期待 Qt 有一个代表 :pressed 状态的属性/属性。但我猜不是。直到 Qt 决定添加它。 你,先生,让我开心!【参考方案2】:

您可以在 mousePressEvent 和 mouseReleaseEvent 中使用您想要的样式执行“setStyleSheet()”吗?

【讨论】:

是的。我现在有这个。事实上,我正在获取当前样式表字符串,提取字符串的 :pressed 部分并将其设置在 mousePressed() 中,并在 mouseReleased() 中恢复正常样式表作为解决方法。我正在寻找一个合适的解决方案,因为我需要使用多个自定义小部件。

以上是关于[Qt]如何支持:自定义小部件样式表的按下状态?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 中自定义小部件的自定义样式

自定义小部件的 Qt 样式表

在 Qt 中为整个小部件设置样式表

如何在 Qt 层次结构的根小部件中获取鼠标按下事件

Qt:如何将类连接到自定义 Qt 设计器小部件

QT编程时如何使按钮的颜色发生变化