2017-02-26 30 views
1

간단해야하지만 어떻게 든 작동하지 않습니다. QListWidget에 eventFilter 마우스 버튼을 누르거나 놓으려고합니다. ListWidget은 UI로 준비되었습니다.QListWidget에서 MouseButtonRelease가있는 QT eventFilter가 마우스 누르기/해제를 감지하지 않습니다.

bool eventFilter(QObject *obj, QEvent *event); 

을 그리고 만들어 MainWindow를

에서
bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 

if (event->type() == QEvent::KeyPress) 
{ 

    qDebug() << "Keyboard press"; 

} else if (event->type() == QEvent::MouseButtonRelease) { 

    qDebug() << "Mouse press L"; 

} else if(event->type() == QEvent::ContextMenu) { 

    qDebug() << "Mouse press R"; 
} 

return QObject::eventFilter(obj, event); 
} 

내가 워드 프로세서에서 확인하고 한 :이

ui->listWidget->installEventFilter(this); 

나는 공중에서 헤더에 추가 한 것처럼 eventFilter를 설치 한 주어진 QWidget에 보내기 전에 모든 이벤트가 eventHandler에 전달된다고 말합니다. 그리고 그것은 부분적으로 사실입니다. KeyPress와 ContextMenu가 작동하기 때문입니다. 리스트 위젯이 blocksingals (true)로 설정 되었더라도.

문제는 MouseButtonRelease/Press가 작동하지 않는 것입니다. 뭔가가 그것을 차단하고 있으며 어떻게 작동시키는 지 알지 못합니다. 나는 on_listWidget_clicked도 가지고 있지만 여전히 그것을 제거하는 것은 여전히 ​​작동하지 않습니다.

도와주세요. 당신이 QListWidget에 마우스 버튼을 눌렀다/때 감사

답변

1

뭔가는 QMouseEventQListWidget로 전송되지 않습니다, 바로 그것이

을 차단하고 있습니다. 대신 이벤트는 마우스 이벤트가 발생한 위젯, 즉 QListWidgetviewport으로 전송됩니다.

사실, 질문에 언급 된 모든 이벤트가 뷰포트로 전송되었습니다 (이벤트가 실제로 발생했기 때문에). 그러나 뷰포트가이를 무시했기 때문에 이러한 이벤트는 이벤트 필터를 설치 한 뷰포트의 상위 위젯 (QListWidget)으로 전파되어 가로 챈 것입니다. QListWidget에 클릭 이벤트를 가로 챌 수 있도록하기 위해

, 당신은 중 하나를 서브 클래스 QListWidget해야하고 무시 viewportEvent(), 을 (그리고 당신이 거기에 관심이있는 어떤 사건 처리) 또는 당신은 당신의 eventfilter를 설치할 수 있습니다 뷰포트 대신 :

ui->listWidget->viewport()->installEventFilter(this); 
+0

굉장! 고마워 지금은 일하고있어 :) – Pilot