デフォルトのマウスイベント動作
QVTKOpenGLWidgetではマウス操作に関して以下の動作がデフォルトで実装されている。
- 左ボタンドラッグ:回転
- 右ボタンドラッグ:拡大縮小
- 真中ボタンドラッグ:平行移動
- Ctrl+ホイール回転:拡大縮小
拡大縮小はホイール操作のほうが直感的なのと、自分で定義したマウス操作を実装するのに邪魔なので、
デフォルトの右ボタンドラッグを無効化して、独自のマウス操作を実装したい。
Qtでのマウスイベント処理を変更して対応(うまくいかない)
このような場合すぐ思いつくのは、QVTKOpenGLWidgetを継承したクラスを作成し、QVTKOpenGLWidget::eventをoverrideして実装する、という方法である。例えばMyWidgetクラスを以下のようにして、右クリックイベントを実装する。
MyWidget.cpp
class QVTKOpenGLWidget;
class MyWidget : public QVTKOpenGLWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent): QVTKOpenGLWidget(parent){;}
protected:
bool event(QEvent *ev) override;
};
bool MyWidget::event(QEvent *ev)
{
if(ev->type() == QEvent::MouseButtonPress
&& static_cast<QMouseEvent*>(ev)->button() == Qt::RightButton) {
qDebug() << "Right button click event!!!!";
// 適当な処理
return true;
} else {
return QVTKOpenGLWidget::event(ev);
}
}
これで右クリック時に"Right button click event!!!!"が表示され、一件うまく行くように見える…が、QVTKOpenGLWidgetのデフォルト動作は無効化されず、自分の定義した処理と、拡大縮小の両者が実行されてしまう。
vtkデフォルト動作の無効化
これはQVTKOpenGLWidgetではマウスイベント処理をQtベースではなく、VTKベースのvtkInteractorで実装しているため。従って
bool MyWidget::event(QEvent *ev)
{
if(ev->type() == QEvent::MouseButtonPress
&& static_cast<QMouseEvent*>(ev)->button() == Qt::RightButton) {
this->GetInteractor()->Disable();
qDebug() << "Right button click event!!!!";
// 適当な処理。イベント処理後にthis->GetInteractor()->Enable();で再度有効化する。
return true;
} else {
return QVTKOpenGLWidget::event(ev);
}
}
のようにiteractorを一時的に無効化する必要がある。