Handle LeaveEvent separately as it shouldn't be cast to a MouseEvent

This commit is contained in:
Mike Walters
2025-11-30 23:26:25 +00:00
parent 3d136fa968
commit 531402f4e9
11 changed files with 55 additions and 5 deletions

View File

@@ -40,12 +40,12 @@ bool Cursor::pointOverCursor(QPoint point)
bool Cursor::mouseEvent(QEvent::Type type, QMouseEvent *event)
{
// If the mouse pointer moves over a cursor, display a resize pointer
if (pointOverCursor(event->pos()) && type != QEvent::Leave) {
if (pointOverCursor(event->pos())) {
if (!cursorOverriden) {
cursorOverriden = true;
QApplication::setOverrideCursor(QCursor(cursorShape));
}
// Restore pointer if it moves off the cursor, or leaves the widget
// Restore pointer if it moves off the cursor
} else if (cursorOverriden) {
cursorOverriden = false;
QApplication::restoreOverrideCursor();
@@ -77,6 +77,14 @@ bool Cursor::mouseEvent(QEvent::Type type, QMouseEvent *event)
return false;
}
void Cursor::leaveEvent()
{
if (cursorOverriden) {
cursorOverriden = false;
QApplication::restoreOverrideCursor();
}
}
int Cursor::pos()
{
return cursorPosition;

View File

@@ -33,6 +33,7 @@ public:
int pos();
void setPos(int newPos);
bool mouseEvent(QEvent::Type type, QMouseEvent *event);
void leaveEvent();
signals:
void posChanged();

View File

@@ -52,7 +52,7 @@ bool Cursors::mouseEvent(QEvent::Type type, QMouseEvent *event)
return true;
// If the mouse pointer is between the cursors, display a resize pointer
if (pointWithinDragRegion(event->pos()) && type != QEvent::Leave) {
if (pointWithinDragRegion(event->pos()) ) {
if (!cursorOverride) {
cursorOverride = true;
QApplication::setOverrideCursor(QCursor(Qt::SizeAllCursor));
@@ -92,6 +92,17 @@ bool Cursors::mouseEvent(QEvent::Type type, QMouseEvent *event)
return false;
}
void Cursors::leaveEvent()
{
minCursor->leaveEvent();
maxCursor->leaveEvent();
if (cursorOverride) {
cursorOverride = false;
QApplication::restoreOverrideCursor();
}
}
void Cursors::paintFront(QPainter &painter, QRect &rect, range_t<size_t> sampleRange)
{
painter.save();

View File

@@ -34,6 +34,7 @@ public:
Cursors(QObject * parent);
int segments();
bool mouseEvent(QEvent::Type type, QMouseEvent *event);
void leaveEvent();
void paintFront(QPainter &painter, QRect &rect, range_t<size_t> sampleRange);
range_t<int> selection();
void setSegments(int segments);

View File

@@ -39,6 +39,11 @@ bool Plot::mouseEvent(QEvent::Type type, QMouseEvent *event)
return false;
}
void Plot::leaveEvent()
{
}
std::shared_ptr<AbstractSampleSource> Plot::output()
{
return sampleSource;

View File

@@ -34,6 +34,7 @@ public:
~Plot();
void invalidateEvent() override;
virtual bool mouseEvent(QEvent::Type type, QMouseEvent *event);
virtual void leaveEvent();
virtual std::shared_ptr<AbstractSampleSource> output();
virtual void paintBack(QPainter &painter, QRect &rect, range_t<size_t> sampleRange);
virtual void paintMid(QPainter &painter, QRect &rect, range_t<size_t> sampleRange);

View File

@@ -253,8 +253,7 @@ bool PlotView::viewportEvent(QEvent *event) {
// Pass mouse events to individual plot objects
if (event->type() == QEvent::MouseButtonPress ||
event->type() == QEvent::MouseMove ||
event->type() == QEvent::MouseButtonRelease ||
event->type() == QEvent::Leave) {
event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
@@ -281,6 +280,15 @@ bool PlotView::viewportEvent(QEvent *event) {
return true;
}
if (event->type() == QEvent::Leave) {
for (auto&& plot : plots) {
plot->leaveEvent();
}
if (cursorsEnabled)
cursors.leaveEvent();
}
// Handle parent eveents
return QGraphicsView::viewportEvent(event);
}

View File

@@ -359,6 +359,12 @@ bool SpectrogramPlot::mouseEvent(QEvent::Type type, QMouseEvent *event)
return false;
}
void SpectrogramPlot::leaveEvent()
{
if (tunerEnabled())
tuner.leaveEvent();
}
std::shared_ptr<AbstractSampleSource> SpectrogramPlot::output()
{
return tunerTransform;

View File

@@ -68,6 +68,7 @@ public:
void paintFront(QPainter &painter, QRect &rect, range_t<size_t> sampleRange) override;
void paintMid(QPainter &painter, QRect &rect, range_t<size_t> sampleRange) override;
bool mouseEvent(QEvent::Type type, QMouseEvent *event) override;
void leaveEvent();
std::shared_ptr<SampleSource<std::complex<float>>> input() { return inputSource; };
void setSampleRate(double sampleRate);
bool tunerEnabled();

View File

@@ -75,6 +75,13 @@ bool Tuner::mouseEvent(QEvent::Type type, QMouseEvent *event)
return false;
}
void Tuner::leaveEvent()
{
cfCursor->leaveEvent();
minCursor->leaveEvent();
maxCursor->leaveEvent();
}
void Tuner::paintFront(QPainter &painter, QRect &rect, range_t<size_t> sampleRange)
{
painter.save();

View File

@@ -35,6 +35,7 @@ public:
int centre();
int deviation();
bool mouseEvent(QEvent::Type, QMouseEvent *event);
void leaveEvent();
void paintFront(QPainter &painter, QRect &rect, range_t<size_t> sampleRange);
void setCentre(int centre);
void setDeviation(int dev);