Report preparation
What happened?
What Happened
The MEM+ and DAX buttons in the SpectrumOverlayMenu sidebar show their tooltip
briefly (~0.5 s) and then it disappears. MEM▶, the button immediately above,
works correctly.
All three buttons have tooltips set unconditionally in the constructor
(SpectrumOverlayMenu.cpp:148-158). No event filter intercepts QEvent::ToolTip
for these widgets. No setToolTipDuration override exists anywhere in the codebase.
Root Cause
SpectrumWidget has setMouseTracking(true) active at all times. Its
mouseMoveEvent calls QToolTip::hideText() unconditionally in the band plan bar
region (line 2470). Because SpectrumOverlayMenu is a child widget drawn over
SpectrumWidget, mouse-move events over the overlay buttons reach
SpectrumWidget::mouseMoveEvent, which tests the cursor y-position against
internal spectrum regions -- not against child widget bounds.
SpectrumOverlayMenu uses manual geometry (move()). Button positions within the
widget, and their corresponding y-coordinates inside SpectrumWidget:
| Button |
y in overlay |
Lands in SpectrumWidget region |
| MEM▶ |
146-167 |
FFT spectrum area -- no hideText() |
| MEM+ |
170-191 |
Band plan bar (y=162-170) -- hideText() fires on first hover pixel |
| DAX |
194-215 |
Waterfall zone -- separate code path, hideText() likely fires there too |
MEM+ starts at exactly the bottom pixel of the band plan bar. Any hover over MEM+
immediately fires hideText() before Qt's tooltip timer can complete. DAX falls
in the waterfall zone where a similar suppression applies.
Suggested Fix
Guard every QToolTip::hideText() call in SpectrumWidget::mouseMoveEvent and
updateTrackedCursorState() with a childAt() check. If the cursor is over a
child widget, skip the hideText() call entirely -- the child owns the tooltip
at that point.
Example for mouseMoveEvent:
void SpectrumWidget::mouseMoveEvent(QMouseEvent* ev)
{
// Let child widgets (e.g. SpectrumOverlayMenu buttons) own their tooltips.
if (childAt(ev->position().toPoint())) {
ev->ignore();
return;
}
// ... existing code ...
}
The same guard should be applied to updateTrackedCursorState() before the
hideText() call at line 1654.
Code References
- Tooltip set on buttons:
SpectrumOverlayMenu.cpp:148-158
QToolTip::hideText() in band bar path: SpectrumWidget.cpp:2470
QToolTip::hideText() in updateTrackedCursorState(): SpectrumWidget.cpp:1654, 1677
setMouseTracking(true): SpectrumWidget.cpp:169, 2708, 2828, 3216, 3224
- Button layout with y-positions:
SpectrumOverlayMenu.cpp:660-680
What did you expect?
Acceptance Criteria
Steps to reproduce
Steps to Reproduce
- Open AetherSDR (radio connection not required).
- Click
→ to expand the spectrum sidebar.
- Hover over MEM▶ -- tooltip appears and stays.
- Hover over MEM+ -- tooltip appears for ~0.5 s then disappears.
- Hover over DAX -- same as MEM+.
AetherSDR version
0.9.6
Radio model & firmware
FLEX-6600
Operating system
Linux
OS version and hardware
CachyOS @latest
Report preparation
What happened?
What Happened
The MEM+ and DAX buttons in the
SpectrumOverlayMenusidebar show their tooltipbriefly (~0.5 s) and then it disappears. MEM▶, the button immediately above,
works correctly.
All three buttons have tooltips set unconditionally in the constructor
(
SpectrumOverlayMenu.cpp:148-158). No event filter interceptsQEvent::ToolTipfor these widgets. No
setToolTipDurationoverride exists anywhere in the codebase.Root Cause
SpectrumWidgethassetMouseTracking(true)active at all times. ItsmouseMoveEventcallsQToolTip::hideText()unconditionally in the band plan barregion (line 2470). Because
SpectrumOverlayMenuis a child widget drawn overSpectrumWidget, mouse-move events over the overlay buttons reachSpectrumWidget::mouseMoveEvent, which tests the cursor y-position againstinternal spectrum regions -- not against child widget bounds.
SpectrumOverlayMenuuses manual geometry (move()). Button positions within thewidget, and their corresponding y-coordinates inside
SpectrumWidget:MEM+ starts at exactly the bottom pixel of the band plan bar. Any hover over MEM+
immediately fires
hideText()before Qt's tooltip timer can complete. DAX fallsin the waterfall zone where a similar suppression applies.
Suggested Fix
Guard every
QToolTip::hideText()call inSpectrumWidget::mouseMoveEventandupdateTrackedCursorState()with achildAt()check. If the cursor is over achild widget, skip the
hideText()call entirely -- the child owns the tooltipat that point.
Example for
mouseMoveEvent:The same guard should be applied to
updateTrackedCursorState()before thehideText()call at line 1654.Code References
SpectrumOverlayMenu.cpp:148-158QToolTip::hideText()in band bar path:SpectrumWidget.cpp:2470QToolTip::hideText()inupdateTrackedCursorState():SpectrumWidget.cpp:1654, 1677setMouseTracking(true):SpectrumWidget.cpp:169, 2708, 2828, 3216, 3224SpectrumOverlayMenu.cpp:660-680What did you expect?
Acceptance Criteria
Steps to reproduce
Steps to Reproduce
→to expand the spectrum sidebar.AetherSDR version
0.9.6
Radio model & firmware
FLEX-6600
Operating system
Linux
OS version and hardware
CachyOS @latest