首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPushButton不尊重QIcon模式的改变

QPushButton不尊重QIcon模式的改变
EN

Stack Overflow用户
提问于 2020-01-11 00:19:02
回答 2查看 784关注 0票数 0

当应用带有QIconQPushButton::setIcon()时,模式更改似乎不尊重为QIcon设置的模式更改

代码语言:javascript
复制
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::StateQIcon::Mode的每一个组合,没有任何改变。

运行QT5.12.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-02 05:38:33

我通过子类QPushButton和侦听enter和leave事件来解决这个问题。此类在基本图标和悬停图标之间切换。这对我和样式表更有用,因为我根据用户的DPI来调整图标的大小。

代码语言:javascript
复制
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();
    }
};
票数 0
EN

Stack Overflow用户

发布于 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); }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59690573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档