我有一个库来显示图片,我们称它为PictureGLWidget,它具有:
class PictureGLWidget: public QGLWidget {
因此PictureGLWidget扩展了QGLWidget。在PictureGlWidget中

  void PictureGlWidget::mouseReleaseEvent(QMouseEvent* releaseEvent);

已经实现。

我启动了一个自己的项目,可以说类MyMainWindow,在这里我仅使用PictureGlWidget作为Pointerobject:
PictureGlWidget * myPictureGLWidget = new PictureGlWidget(...);
//..
layout->addWidget(myPictureGLWidget , 0, 1);

至此,我已经可以在MainwindowWidget中看到PictureGlWidget和相应的图片了。当我单击该PictureGlWidget时,按住鼠标,我可以移动图片(如2D滚动),因为它比我的小MainWindow大得多。

进一步对PictureGlWidget提供了一个功能
bool PictureGlWidget::getPictureLocation(double& xPos, double& yPos);

这只是告诉我“图片”中心位置,在该位置释放了图片的当前剪辑。记住我的图片比我的小MainWindowWidget大得多,因此比我的PictureGLWidget大得多。想象图片有4000x4000px(0,0左上)。 PictureGLWidget仅用于显示,例如800x800px。因此,getPictureLocation()设置当前显示图片部分的中心坐标,并且它将返回类似(400,400)的内容,该内容可能位于中间的左上角。

在滚动该小部件并释放鼠标之后,我想捕获当前显示的图片部分(仅占该大图片的一小部分)的中心位置。我以为我是通过覆盖
MyMainWindow::mouseReleaseEvent(QMouseEvent *event){ qDebug() << "Mouse released!"; }
方法,但尚未在任何地方连接它。当前它对我的mouseReleases没有反应,并且不显示文本。

最佳答案

您可以覆盖QWidget中可以对某些事件使用react的虚拟 protected 方法,而无需“连接”。这些不是Qt插槽,而是经典功能Qt在必要时自动调用。

Qt Event system doc中所述,如果实现PictureGlWidget::mouseReleaseEvent(QMouseEvent*)接受事件,则该事件不会传播到父窗口小部件。但是您可以在PictureGLWidget中安装事件过滤器,并在事件发送到事件接收器之前接收事件。

PictureGlWidget * myPictureGLWidget = new PictureGlWidget(...);
layout->addWidget(myPictureGLWidget , 0, 1);
myPictureGLWidget->installEventFilter(this);

然后在您的主窗口中实现正确的方法:
bool MyMainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == myPictureGLWidget && event->type() == QEvent::MouseButtonRelease) {
        QMouseEvent * mouseEvent = static_cast<QMouseEvent *>(event);
        // Do what you need here
    }
    // The event will be correctly sent to the widget
    return false;
    // If you want to stop the event propagation now:
    // return true
}

您甚至可以在执行必要的操作后决定是要停止该事件,还是将其发送到PictureQLWidget实例(正常行为)。

文件:
  • http://doc.qt.io/qt-4.8/qobject.html#installEventFilter
  • http://doc.qt.io/qt-4.8/qobject.html#eventFilter
  • 08-04 18:20