2017-09-08 14 views
0

仮想キーボードを作成する必要があります。ボタン押下中にイベントキャッチがありません[QT]

私はQPushButtonを作成しましたが、1つをクリックして別のものをリリースすると、他のボタンはマウスイベントを受け取りません。

私はenterEvent(QEvent *)leaveEvent(QEvent *)を上書きしますが、別のボタンをクリックしたときには成功しません。

誰かがアイデアを得ましたか? QAbstractButtonコードで

答えて

1

:mousePressEventトリガ場合

void QAbstractButton::mousePressEvent(QMouseEvent *e) 
{ 
    Q_D(QAbstractButton); 
    if (e->button() != Qt::LeftButton) { 
     e->ignore(); 
     return; 
    } 
    if (hitButton(e->pos())) { 
     setDown(true); 
     d->pressed = true; 
     repaint(); //flush paint event before invoking potentially expensive operation 
     QApplication::flush(); 
     d->emitPressed(); 
     e->accept(); 
    } else { 
     e->ignore(); 
    } 
} 

、QAbstractButtonはsetDown(true)を呼び出し、QAbstractButtonPrivate(Q_D(QAbstractButton))はd->emitPressed()を呼び出します。その後、他のボタンはイベントを受信せず、すでにアクティブなボタンで処理されます。また、状態d->downをチェックmouseReleaseEvent

void QAbstractButton::mouseReleaseEvent(QMouseEvent *e) 
{ 
    Q_D(QAbstractButton); 
    d->pressed = false; 

    if (e->button() != Qt::LeftButton) { 
     e->ignore(); 
     return; 
    } 

    if (!d->down) { 
     // refresh is required by QMacStyle to resume the default button animation 
     d->refresh(); 
     e->ignore(); 
     return; 
    } 

    if (hitButton(e->pos())) { 
     d->repeatTimer.stop(); 
     d->click(); 
     e->accept(); 
    } else { 
     setDown(false); 
     e->ignore(); 
    } 
} 

あなたは見ることができます。マウスがそのボタンを押すと、d->click(); emitクリックイベントが呼び出されます。マウスがボタンを押していない場合は、setDown(false);を呼び出して状態をリセットします。

マウスイベントをより簡単に処理できるようにQWidgetから仮想ボタンを継承することをお勧めします。

関連する問題