2017-12-08 15 views
1

一部のコードでQt4からQt5への移行では、アプリケーションでイベントをフィルタリングする必要がありますが、それ以上は機能しません。私のソフトウェアは、「エディションモード」のときにすべてのイベントをフィルタリングしなければならないので、いくつかのウィジェット/ボタンを使用/クリックできるだけです。QWidgetWindowをQt5のイベントフィルタのQObjectとして使用

私はクラスInputGrabberQVectorQWidgetへのポインタとeventFilterの関数を持っています。 「編集」モードに渡したとき、私は利用できるようになります私のInputGrabberQVectorにウィジェットポインタを追加します。

bool InputGrabber::eventFilter (QObject* object, QEvent* anevent) 
{ 
    if (QInputEvent* event = dynamic_cast <QInputEvent*> (anevent)) 
     { 
     QWidget* widget = dynamic_cast <QWidget*> (object); 
     if (widget) 
     { 
      if (_widgetList.contains (widget) || _widgetList.contains (widget->parentWidget())) 
      return QObject::eventFilter (object, event); 
      else if (QDialog* dlg = dynamic_cast <QDialog*> (widget)) 
      return QObject::eventFilter (object, event); 
      else if (QDialogButtonBox* dlg = dynamic_cast <QDialogButtonBox*> (widget->parentWidget())) 
      return QObject::eventFilter (object, event); 
      else 
      return true; 
     } 
     else 
      return true; 
     } 
     else 
     return QObject::eventFilter (object, event); 
    } 
} 

_inputGrabber->add (_gpView); 
_inputGrabber->add (_gpView->viewport()); 
_inputGrabber->add (_gpView->horizontalScrollBar()); 
_inputGrabber->add (_gpView->verticalScrollBar()); 
_inputGrabber->add (_view->mainWindow().toolBarMap()["editSquel"]); 

、その後、eventFilter上のコードは次のようになっ機能オブジェクトがから継承したときに

QWidget* widget = dynamic_cast <QWidget*> (object); 

戻りNULL

Qt5に移行問題はその次のキャストであります。

誰も同じ問題を発見し、同じ戦略に従った解決策を得ましたか?ソフトウェアの動作を変えたり、すべてのウィジェットでループを作成したり、それぞれにsetDisabled()を設定したりするのは嫌です。

ありがとうございました!あなたが明示的にtrueを返すかしていない場合は、このよう

bool InputGrabber::eventFilter (QObject* object, QEvent* anevent) 
{ 
    if (QInputEvent* event = dynamic_cast <QInputEvent*> (anevent)) 
    { 
    //etc 
    } 
    return QObject::eventFilter (object, anevent); 
} 

return QObject::eventFilter (object, event); 

return QObject::eventFilter (object, anevent); 

、おそらく次のようになります。

+0

'dynamic_cast'を使う本当の理由はありますか? 'qobject_cast' instedを試してください。それは同じ構文を持ち、より速く動作します。 –

+3

'QWidgetWindow'とは何ですか? 'QWindow'を意味しますか?もしそうなら、 'QWindow'派生クラスの' QWidget'ロジックを単に繰り返すことはできませんか? –

+0

'QWidgetWindow'は' QWindow'を継承し、Qt5では 'QWidget'を継承しないので、dynamic_castとqobject_castの両方が' NULL'を返します。 –

答えて

0

私はあなたのコードはここに間違っていると思いますfalseの場合、常にチェーン内のイベントを正しく伝播します。

キャストに失敗した場合は、何も返さずに最後の行に戻すようにしてください。何かを知っていないオブジェクト(例えばmisterious QWidgetWindowのような)に会ったときに何らかの形でイベントの伝播を止めたら、おそらくUIロジックが壊れているでしょう。伝播を続行させると、待っているイベントが間もなくまたはすぐ後に出る可能性が非常に高いです。

+0

あなたのコメントと返信に感謝します。将来、私はQObjectsのqobject_castを使用しますが、ソリューションは@paoloが提案したロジックに従います:ウィジェットキャストが失敗した場合、イベントを自由に宣伝しましょう: if(widget) {ここでコード } else return QObject :: eventFilter(object、event); – Natxo14

関連する問題