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 は ubtn ではなく QMessageBox に移動します。

この問題を回避する最も簡単な方法は、ubtn が mousePressEvent() ではなく mouseReleaseEvent() メソッドから「emit clicked()」を呼び出すことだと思います。そうすれば、QMessageBox が表示される前にボタンを通常の色に戻すことができるため、active-window-change が発生します。

于 2013-08-09T06:00:36.530 に答える