Итак, у меня есть собственный класс 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));
}
Итак, проблема в том, что когда вы показываете QMessageBox, QMessageBox становится активным окном … поэтому, когда пользователь отпускает кнопку мыши, mouseReleaseEvent переходит к QMessageBox, а не к вашему ubtn.
Я думаю, что самый простой способ обойти эту проблему — чтобы ubtn вызывал «emit clicked ()» из метода mouseReleaseEvent (), а не mousePressEvent (); таким образом, кнопка может вернуться к своему обычному цвету, прежде чем отобразится QMessageBox, и, следовательно, произойдет изменение активного окна.
Попробуйте это в функции defaultBtn:
setStyleSheet(sty);
style()->unpolish(this);
style()->polish(this);