0

应用QIconwithQPushButton::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没有改变。

运行 Qt 5.12.1

4

2 回答 2

1

这只是QPushButton处理状态(以及图标模式/状态)的方式,这与QToolButton. 更具体地说,它是当前QStyle子类如何使用按钮状态信息来绘制图标。例如,这里是QPushButton::paintEvent() 代码(按照该代码查看initStyleOption()初始化状态数据的调用),然后将样式选项移交给当前活动的QStyle(可能是例如 WindowsVista/Macintosh/Fusion/StyleSheets,具体取决于操作系统或设置) . 然后如果我们看一下,例如,相关QFusionStyle 代码我们可以看到图标Active模式仅在按钮具有焦点时使用。或相同QCommonStyleWindows/WindowsVista/Macintosh 样式都回退到)。

要解决这个问题,您可以使用 CSS 并image为状态设置一个属性,或者为控制元素QPushButton:hover实现您自己的QProxyStyle::drawControl()方法。CE_PushButtonLabel

CSS:QPushButton:hover { image: url(/path/to/icon.png); }

于 2020-01-11T07:54:02.623 回答
0

我通过子类QPushButton化和监听进入和离开事件来解决这个问题。此类在基本图标和悬停图标之间切换。这对我来说比样式表更有用,因为我根据用户的 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();
    }
};
于 2021-08-02T05:38:33.623 回答