2

我有一个库来显示图片,我们称之为 PictureGLWidget,其中包含:

class PictureGLWidget: public QGLWidget {

所以 PictureGLWidget 扩展了 QGLWidget。在 PictureGlWidget 中

  void PictureGlWidget::mouseReleaseEvent(QMouseEvent* releaseEvent);

已经实施。

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

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 仅用于显示 800x800 像素。所以 getPictureLocation() 设置当前显示图片部分的中心坐标,它会返回类似 (400, 400) 的东西,它可能位于左上角的中间位置。

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

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

方法,但还没有在任何地方连接它。目前它没有对我的 mouseReleases 做出反应,并且没有显示该文本。

4

2 回答 2

1

您可以覆盖以对某些事件做出反应的 QWidget 中的虚拟保护方法不需要“连接”。这些不是 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 实例(正常行为)。

文件:

于 2015-07-20T13:32:50.340 回答
-1

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

于 2015-07-20T13:42:15.243 回答