Skip to content

Commit d626a3b

Browse files
committed
Merge bitcoin#19210: qt: Get rid of cursor in out-of-focus labels
bd315eb qt: Get rid of cursor in out-of-focus labels (Hennadii Stepanov) Pull request description: After clicking on `QLabel` with selectable text the cursor remains forever: ![47532924-65e7b200-d8ba-11e8-9254-7bde658961cb](https://user-images.githubusercontent.com/32963518/84038485-ad945200-a9a8-11ea-89e3-c7c17d02a611.png) This PR fixes this visual bug. Earlier attempts to fix this issue: - bitcoin#14577 - bitcoin#14810 (combined with other UX feature) ACKs for top commit: promag: Code review ACK bd315eb. laanwj: Tested ACK bd315eb Tree-SHA512: 6bf89362412e5ce9a4dec6944b62fe44fc31ca49cda7f6e2eb37e847fac9dccb68bca7ac6877b19e42add2333e40d0b4265757ead105ac0a5d28f8ab43b322c3
2 parents 21209c9 + bd315eb commit d626a3b

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

src/qt/bitcoin.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,8 @@ int GuiMain(int argc, char* argv[])
556556
/// 9. Main GUI initialization
557557
// Install global event filter that makes sure that long tooltips can be word-wrapped
558558
app.installEventFilter(new GUIUtil::ToolTipToRichTextFilter(TOOLTIP_WRAP_THRESHOLD, &app));
559+
// Install global event filter that makes sure that out-of-focus labels do not contain text cursor.
560+
app.installEventFilter(new GUIUtil::LabelOutOfFocusEventFilter(&app));
559561
#if defined(Q_OS_WIN)
560562
// Install global event filter for processing Windows session related Windows messages (WM_QUERYENDSESSION and WM_ENDSESSION)
561563
qApp->installNativeEventFilter(new WinShutdownMonitor());

src/qt/guiutil.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,28 @@ bool ToolTipToRichTextFilter::eventFilter(QObject *obj, QEvent *evt)
450450
return QObject::eventFilter(obj, evt);
451451
}
452452

453+
LabelOutOfFocusEventFilter::LabelOutOfFocusEventFilter(QObject* parent)
454+
: QObject(parent)
455+
{
456+
}
457+
458+
bool LabelOutOfFocusEventFilter::eventFilter(QObject* watched, QEvent* event)
459+
{
460+
if (event->type() == QEvent::FocusOut) {
461+
auto focus_out = static_cast<QFocusEvent*>(event);
462+
if (focus_out->reason() != Qt::PopupFocusReason) {
463+
auto label = qobject_cast<QLabel*>(watched);
464+
if (label) {
465+
auto flags = label->textInteractionFlags();
466+
label->setTextInteractionFlags(Qt::NoTextInteraction);
467+
label->setTextInteractionFlags(flags);
468+
}
469+
}
470+
}
471+
472+
return QObject::eventFilter(watched, event);
473+
}
474+
453475
void TableViewLastColumnResizingFixer::connectViewHeadersSignals()
454476
{
455477
connect(tableView->horizontalHeader(), &QHeaderView::sectionResized, this, &TableViewLastColumnResizingFixer::on_sectionResized);

src/qt/guiutil.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,21 @@ namespace GUIUtil
161161
int size_threshold;
162162
};
163163

164+
/**
165+
* Qt event filter that intercepts QEvent::FocusOut events for QLabel objects, and
166+
* resets their `textInteractionFlags' property to get rid of the visible cursor.
167+
*
168+
* This is a temporary fix of QTBUG-59514.
169+
*/
170+
class LabelOutOfFocusEventFilter : public QObject
171+
{
172+
Q_OBJECT
173+
174+
public:
175+
explicit LabelOutOfFocusEventFilter(QObject* parent);
176+
bool eventFilter(QObject* watched, QEvent* event) override;
177+
};
178+
164179
/**
165180
* Makes a QTableView last column feel as if it was being resized from its left border.
166181
* Also makes sure the column widths are never larger than the table's viewport.

0 commit comments

Comments
 (0)