2017-12-08 44 views
1

일부 코드에서 Qt4에서 Qt5로 마이그레이션 할 때 응용 프로그램에서 이벤트를 필터링해야하지만 더 이상 작동하지 않습니다. 내 소프트웨어는 "에디션 모드"에서 모든 이벤트를 필터링해야하므로 일부 위젯/버튼 만 사용 가능/클릭 할 수 있습니다.이벤트 필터에서 Qt5로 QWidgetWindow를 사용합니다.

나는 QVector의 포인터가 QWidget이고 eventFilter 포인터 인 클래스 InputGrabber을 가지고 있습니다. eventFilter이 기능에 코드가 같이 간다,

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

다음 :에 전달할 때 "편집"모드, 내가 사용할 수 있습니다 내 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); 
    } 
} 
객체가에서 상속 할 때

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'는 Qt5에서'QWidget'을 상속받지 않고'QWidget'을 상속받습니다. 따라서 dynamic_cast와 qobject_cast 모두'NULL'을 반환합니다. –

답변

0

난 당신의 코드가 여기에 잘못된 생각 false이면 항상 체인의 이벤트를 올바르게 전파합니다.

캐스트가 실패하면 아무 것도 반환하지 않고 마지막 행으로 되돌립니다. 어떻게 든 알지 못하는 객체를 만났을 때 이벤트 전파를 중지하면 (예 : mystious QWidgetWindow) UI 로직을 위반하게됩니다. 전파가 계속되면 곧 기다리고있는 이벤트가 조만간 나타날 것입니다.

+0

모든 의견과 답장을 보내 주셔서 감사합니다.앞으로 qObjects에 대해 qobject_cast를 사용할 것입니다. 그러나 해결책은 @paolo가 제안한 논리에 따라 제공됩니다. 위젯 캐스트가 실패하면 이벤트를 자유롭게 전파 할 수 있습니다. if (widget) {// some 여기에 코드 } else return QObject :: eventFilter (object, event); – Natxo14