QT:如何更改悬停事件上的按钮图标?

问题描述 投票:0回答:1

我有一个自定义按钮类

class MyButton : public QPushButton {
public:
    MyButton(const QString &normalImage, const QString &hoverImage, QSize size, QWidget *parent = nullptr)
            : QPushButton(parent), normalImage(normalImage), hoverImage(hoverImage) {
        setFixedSize(size);
        setFlat(true);
    }

    void setTextColor(const QString& color) {
        QString style = "QPushButton {"
                        "  background-image: url(%1);"
                        "  color: " + color + ";"
                        "  border: none;"
                        "}"
                        "QPushButton:hover {"
                        "  background-image: url(%2);"
                        "}";
        setStyleSheet(style.arg(normalImage, hoverImage));
    }

private:
    QString normalImage;
    QString hoverImage;
};

我还必须向图像添加一个 icon.png :

MyButton* b1 = new MyButton("Default.png","Hover.png",QSize(140, 40), this);
b1->setText("Text");
b1->setIcon(QIcon("Icon_Dark.png"));

代码运行良好。 但是如何更改悬停事件上的图标?

我想要一个MyButton类的方法

void onHoverEvent() {
    this->setIcon(QIcon("Icon_NEW.png"));
}

当鼠标不在按钮上时,图标应恢复为初始状态

c++ qt
1个回答
0
投票

如评论中所示,您可以使用

QMouseEvent
。添加到您的班级:

#include <QMouseEvent>

class MyButton : public QPushButton {
public:
    MyButton(const QString &normalImage, const QString &hoverImage, QSize size, QWidget *parent = nullptr)
            : QPushButton(parent), normalImage(normalImage), hoverImage(hoverImage) {
        setFixedSize(size);
        setFlat(true);
        setIcon(QIcon("Icon_Dark.png"));
    }

    void setTextColor(const QString& color) {
        QString style = "QPushButton {"
                        "  background-image: url(%1);"
                        "  color: " + color + ";"
                        "  border: none;"
                        "}"
                        "QPushButton:hover {"
                        "  background-image: url(%2);"
                        "}";
        setStyleSheet(style.arg(normalImage, hoverImage));
    }

    void mouseMoveEvent(QMouseEvent *event){
        qreal delta = 3;
        QRect hover_area(delta, delta, width() - 2*delta, height() - 2*delta);
        if(hover_area.contains(event->pos()))
            setIcon(QIcon("Icon_NEW.png"));
        else
            setIcon(QIcon("Icon_Dark.png"));
    }

private:
    QString normalImage;
    QString hoverImage;
};

唯一的小不便是

QMouseEvent
不直接随悬停事件一起出现。但你可以将
mouseMoveEvent
修改为稍微小一点的区域,这样当光标退出该区域时图标可以重置。

© www.soinside.com 2019 - 2024. All rights reserved.