我有一个库来显示图片,我们称之为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做出反应,并且不显示该文本。
答案 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关键字