当应用带有QIcon的QPushButton::setIcon()时,模式更改似乎不尊重为QIcon设置的模式更改
QIcon helpIcon;
helpIcon.addPixmap(QPixmap(":/icons/style/help.png"), QIcon::Normal);
helpIcon.addPixmap(QPixmap(":/icons/style/help_hover.png"), QIcon::Active); //ignored?
QPushButton *myButton = new QPushButton(this);
myButton->setIcon(helpIcon);我所期望的是,当按钮悬停时,图标应该从一个像素映射到另一个像素映射。相反,图标保持不变。只有当按下按钮时,它才会改变。我尝试过QIcon::State和QIcon::Mode的每一个组合,没有任何改变。
运行QT5.12.1
发布于 2021-08-02 05:38:33
我通过子类QPushButton和侦听enter和leave事件来解决这个问题。此类在基本图标和悬停图标之间切换。这对我和样式表更有用,因为我根据用户的DPI来调整图标的大小。
class CustomButton : public QPushButton
{
Q_OBJECT
public:
CustomButton(QWidget *parent = nullptr);
void setBaseIcon(QIcon icon){
baseIcon = icon;
setIcon(baseIcon);
}
void setHoverIcon(QIcon icon){hoverIcon = icon;}
private:
QIcon baseIcon;
QIcon hoverIcon;
protected:
virtual void enterEvent(QEvent *){
setIcon(hoverIcon);
update();
}
virtual void leaveEvent(QEvent *){
setIcon(baseIcon);
update();
}
};发布于 2020-01-11 07:54:02
这就是QPushButton处理状态(因此是图标模式/状态)的方式,这与QToolButton不同。更具体地说,它是当前QStyle子类如何使用按钮状态信息来绘制图标。例如,下面是QPushButton::paintEvent() 代码 (为了查看状态数据初始化的initStyleOption()调用),然后将样式选项传递给当前活动的QStyle (可以是eg )。WindowsVista/Macintosh/Fusion/StyleSheets取决于操作系统或设置)。然后,如果我们查看相关的QFusionStyle 代码,我们可以看到图标模式仅在按钮具有焦点时使用。或者相同的 in QCommonStyle (QCommonStyle/WindowsVista/Macintosh样式都归其所有)。
要解决这个问题,您可以使用CSS并为QPushButton:hover状态设置一个QPushButton:hover属性,或者为CE_PushButtonLabel控件元素实现您自己的QProxyStyle::drawControl()方法。
CSS:QPushButton:hover { image: url(/path/to/icon.png); }
https://stackoverflow.com/questions/59690573
复制相似问题