Qt mouseReleaseEvent() not trigggered?



我有一个库来显示图片,我们把它命名为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滚动),因为它比我的小主窗口大得多。

进一步说明PictureGlWidget提供了一个函数

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

它告诉我图片的中心位置,我在哪里释放了图片的当前剪辑。记住,我的图片比MainWindowWidget大得多因此也比PictureGLWidget大得多。假设图片尺寸为4000x4000px(左上角0,0)。PictureGLWidget只显示800x800px。所以getPictureLocation()设置当前显示的图片部分的中心坐标,它将返回类似于(400,400)的东西,它可能位于左上角的某个地方。

我想要抓取当前显示的图片部分(只是大图片的一小部分)的中心位置,在滚动Widget并释放鼠标之后。我想我是通过重写

来实现的

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

方法,但尚未将其连接到任何地方。目前它没有对我的mouserreleases做出反应,并且文本没有显示

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

正如Qt事件系统文档中所解释的,如果实现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

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

相关内容

  • 没有找到相关文章

最新更新