所以,我有一个自定义的QLabel类,我将其用作按钮。单击标签时,背景颜色从红色变为绿色。在鼠标释放事件中,背景变为红色。但是,如果我向窗口小部件的“单击”信号添加一个插槽,则鼠标释放事件似乎永远不会被触发。标签保持绿色。目前,我已经这样了,当点击标签时,会显示一个QMessageBox。然而,即使在消息框关闭后,标签仍保持绿色。我尝试将它的focusOutEvent连接到将背景变为红色的同一个插槽,但它仍然无法正常工作。如何在释放鼠标后立即让按钮恢复为红色背景?我希望这是有道理的。有什么想法吗?
#include "ubtn.h"
QString sty = "ubtn{background:red;}";
QString styd = "ubtn{background:green;}";
QWidget *obj;
ubtn::ubtn(QWidget *parent) :
QLabel(parent)
{
this->setStyleSheet(sty);
connect(this, SIGNAL(onBlur(bool)), SLOT(defaultBtn()));
}
void ubtn::defaultBtn()
{
this->setStyleSheet(sty);
this->repaint();
}
void ubtn::downBtn()
{
this->setStyleSheet(styd);
this->repaint();
}
void ubtn::mousePressEvent(QMouseEvent *ev)
{
downBtn();
emit clicked();
}
void ubtn::mouseReleaseEvent(QMouseEvent *ev)
{
defaultBtn();
}
void ubtn::focusOutEvent(QFocusEvent *e)
{
QLabel::focusOutEvent(e);
emit(onBlur(true));
}
答案 0 :(得分:0)
在defaultBtn函数中尝试:
setStyleSheet(sty);
style()->unpolish(this);
style()->polish(this);
答案 1 :(得分:0)
好的,问题是当你展示QMessageBox时,QMessageBox变成活动窗口......所以当用户释放鼠标按钮时,mouseReleaseEvent会转到QMessageBox而不是你的ubtn。
我认为解决问题的最简单方法是让ubtn从mouseReleaseEvent()方法调用“emit clicked()”而不是mousePressEvent();这样,按钮可以在显示QMessageBox之前恢复为常规颜色,因此会发生活动窗口更改。