我有一个自定义按钮类
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"));
}
当鼠标不在按钮上时,图标应恢复为初始状态
如评论中所示,您可以使用
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
修改为稍微小一点的区域,这样当光标退出该区域时图标可以重置。