Qt mouseReleaseEvent () не сработало?

У меня есть библиотека для отображения изображений, давайте назовем ее 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);

Здесь, на данный момент, я уже вижу PictureGlWidget и соответствующую картинку в моем MainwindowWidget. Когда я щелкаю в этом PictureGlWidget, удерживая мышь, я могу переместить изображение (как 2D-прокрутка), так как оно намного больше моего маленького MainWindow.

Далее PictureGlWidget предоставляет функцию

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

который просто говорит мне о положении в центре картинки, где я выпустил текущую вырезку картинки. Помните, что моя картинка намного больше моего маленького MainWindowWidget и, следовательно, намного больше моего PictureGLWidget. Представьте, что картинка имеет 4000×4000 пикселей (0,0 слева вверху). PictureGLWidget предназначен только для отображения, скажем, 800x800px. Таким образом, getPictureLocation () устанавливает центральные координаты текущей отображаемой части изображения и возвращает что-то вроде (400, 400), что может быть где-то в среднем левом верхнем левом углу.

Я хотел бы взять текущую отображаемую часть изображения (только небольшую часть этой большой картинки) по центру после прокрутки в этом виджете, и я отпустил мышь. Я думал, что я делаю это, перезаписывая

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

метод, но еще никуда не подключал. В настоящее время он не реагирует на мои mouseReleases, и этот текст не отображается.

2

Решение

Виртуальные защищенные методы в 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 instace (нормальное поведение).

Doc:

1

Другие решения

Не забывайте ключевое слово Q_OBJECT в объявлении пользовательского класса MyGLwidget

-1

По вопросам рекламы [email protected]