Qt mouseReleaseEvent()没有触发?

时间:2015-07-20 13:15:58

标签: c++ qt qt5 qmouseevent

我有一个库来显示图片,我们称之为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()设置当前显示的图片部分的中心cooridinates,它将返回类似(400,400)的东西,可能在midldle左上角的某处。

我想抓住当前显示的图片部分(只是该图片的一小部分)中心位置,在滚动浏览Widget后我释放了鼠标。我以为我是通过覆盖

来做到的

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

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

2 个答案:

答案 0 :(得分:1)

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

文档:

答案 1 :(得分:-1)

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