У меня есть библиотека для отображения изображений, давайте назовем ее 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, и этот текст не отображается.
Виртуальные защищенные методы в 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:
Не забывайте ключевое слово Q_OBJECT в объявлении пользовательского класса MyGLwidget