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 关键字
我有一个显示图片的库,我们称它为 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 关键字