2017-02-26 6 views
1

シンプルである必要がありますが、何とか機能しません。私はQListWidgetでeventFilterマウスボタンを押したり離したりして捕まえようとしています。 ListWidgetはUIの下で準備さ​​れました。QListWidgetのMouseButtonReleaseを使用したQT eventFilterがマウスのプレス/リリースを検出していません

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

をそして作成したメインウィンドウ

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

関連する問題