0

所以,我有一个自定义的 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));
 }
4

2 回答 2

0

在 defaultBtn 函数中试试这个:

setStyleSheet(sty);
style()->unpolish(this);
style()->polish(this);
于 2013-08-09T05:44:28.827 回答
0

好的,所以问题是当你显示 QMessageBox 时,QMessageBox 成为活动窗口......所以当用户释放鼠标按钮时,mouseReleaseEvent 会转到 QMessageBox 而不是你的 ubtn。

我认为解决这个问题的最简单方法是让 ubtn 从 mouseReleaseEvent() 方法而不是 mousePressEvent() 调用“emit clicked()”;这样按钮可以在 QMessageBox 显示之前恢复到其常规颜色,因此会发生活动窗口更改。

于 2013-08-09T06:00:36.530 回答