2010-12-02 30 views
6

QWidgetでmouseEnterイベントとmouseLeaveイベントを実装する方法は?QWidgetでmouseEnterイベントとmouseLeaveイベントを実装する方法は?

QWidgetのへのMouseEnter場合、iはQWidgetからmouseLeave次に、iが背景色を設定する必要がある場合は灰色、 に背景色を設定する必要が

白私は

void enterEvent(QEvent *); 
void leaveEvent(QEvent *); 
を試し

の入力内に&イベントを残します。私はbool varibale set trueを使用しています& falseです。私はQPainterイベントupdate()を呼び出しています。以下

コード:私はQWidgetの

QPainter::begin: Paint device returned engine == 0, type: 3 
QPainter::setRenderHint: Painter must be active to set rendering hints 
QPainter::end: Painter not active, aborted 

にマウスを移動していたときに、私は次のエラーを取得しています

void Test::enterEvent(QEvent *) 
{ 
    _mouseMove=true; 
    update(); 

} 

void Test::leaveEvent(QEvent *) 
{ 
    _mouseMove=false; 
    update(); 

} 

void Test::paintEvent(QPaintEvent *) 
{ 
    QPainter painter; 
    painter.begin(&m_targetImage); 
    painter.setRenderHint(QPainter::Antialiasing); 

     if(_mouseMove){ 
      painter.fillRect(QRect(0,0,width(),height()),Qt::white);} 
     else{ 
      painter.fillRect(QRect(0,0,width(),height()),Qt::gray);} 

    painter.end(); 

    QPainter p; 
    p.begin(this); 
    p.drawImage(0, 0, m_targetImage); 
    p.end(); 
} 

この問題を解決するために私を助けてください。もしサンプルコードを持っている人がいたら...

+0

あなたはまたに耳を傾けるでしたupdate()を行うホバーイベント。 Qtスタイルシートはまた、ホバーの状態に応じて異なる設定を可能にします。 –

答えて

2

まずは、メンバーを使ってブール値の代わりに現在の背景色を保存します。これにより、paintEventコードが簡略化されます。

painter.fillRect(QRect(...), m_backColor); 

最初のQPainterにエラーが表示されると思います。 QPainterを使ってイメージを塗りつぶしているのはなぜですか? varがQImageの場合は、例のようにfill functionとdrawImageを使用することができます。 QPixmapには同じ種類の機能があります。

4

stylesを使用してください。

ほとんどのウィジェット:hover擬似状態をサポートし、

test->setStyleSheet(":hover {background-color: #dddddd;}"); 

またはさらに便利ですデザイナーを通じてそれを行うスタイルであなたのウィジェットのbackgroundColorプロパティを設定し、カスタム描画を行う必要がある場合は、それを行います。しかし、あなたは基本的なウィジェットの外観を変更するだけのためにそれを行う必要はありません。

0

別の方法: QStyleOptionを使用してください。

QStyleOption sopt; 
sopt.initFrom(this); 
if(sopt.state & QStyle::State_MouseOver) 
{ 
    painter.fillRect(QRect(...), m_colorHover); 
} 
else 
{ 
    painter.fillRect(QRect(...), m_colorNotHover); 
} 

もStyleOptionの代わりに使用することができunderMouse方法をサポートしたり、解決策属性_mouseMove

2

QWidgetsのように、使用余分な変数を必要としないでください :

if(underMouse()){ 
    painter.fillRect(QRect(0,0,width(),height()),Qt::white);} 
else{ 
    painter.fillRect(QRect(0,0,width(),height()),Qt::gray);} 
関連する問題