Qt mouseReleaseEvent() 没有触发?

Qt mouseReleaseEvent() not trigggered?

我有一个显示图片的库,我们称它为 PictureGLWidget,其中:

class PictureGLWidget: public QGLWidget {

因此 PictureGLWidget 扩展了 QGLWidget。在 PictureGlWidget 中

  void PictureGlWidget::mouseReleaseEvent(QMouseEvent* releaseEvent);

已经实施。

我开始了一个自己的项目,比方说 class MyMainWindow,我只是使用 PictureGlWidget 作为指针对象:

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

到这里,我已经可以在我的MainwindowWidget中看到PictureGlWidget和对应的图片了。当我点击那个 PictureGlWidget 时,按住鼠标,我可以移动图片(像 2D 滚动),因为它比我的小主窗口大得多。

进一步对PictureGlWidget提供了一个功能

bool PictureGlWidget::getPictureLocation(double& xPos, double& yPos);

这只是告诉我图片的中心位置,我在这个位置释放了图片的当前剪辑。请记住,我的图片比我的小 MainWindowWidget 大得多,因此比我的 PictureGLWidget 大得多。假设图片有 4000x4000px(0,0 左上角)。 PictureGLWidget 仅用于显示 800x800px。所以 getPictureLocation() 设置了当前显示图片部分的中心坐标,它会 return 类似 (400, 400) 的东西,它可能在左上角的某个地方。

我想抓住当前显示的图片部分(只是那张大图片的一小部分)中心位置,在那个小部件中滚动并释放鼠标后。我以为我是通过覆盖

MyMainWindow::mouseReleaseEvent(QMouseEvent *event){ qDebug() << "Mouse released!"; }

方法,但还没有连接到任何地方。目前它对我的 mouseReleases 没有反应,也没有显示该文本。

QWidget 中您可以重写以对某些事件做出反应的虚拟受保护方法不需要是 "connected"。这些不是 Qt 槽,而是 Qt 在必要时自动调用的经典函数。

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

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

然后在你的 main 中实现正确的方法 window:

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 实例(正常行为)。

文档:

不要忘记 MyGLwidget 自定义 class 声明中的 Q_OBJECT 关键字