From 288bfb0bbd778fdfa6ac9fdcdc1afc19ec13aeaf Mon Sep 17 00:00:00 2001 From: Elvis Angelaccio Date: Tue, 18 Apr 2017 10:19:12 +0200 Subject: QLineEdit: Make the clear button always the leftmost button QLineEditIconButton currently draws a fully transparent pixmap in its paintEvent() function, when the line edit is empty. This does not work when there is another trailing QAction that is visible even when the line edit has no text, as reported in QTBUG-59957. To fix this issue, make sure the clear button is always the leftmost button. Task-number: QTBUG-59957 Change-Id: I8a4f96aae07856aa0e1053ebb338ba9bdf052a16 Reviewed-by: Friedemann Kleint --- src/widgets/widgets/qlineedit_p.cpp | 11 +++++++++++ .../widgets/widgets/qlineedit/tst_qlineedit.cpp | 23 ++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp index 7c5ba79cb6..e1c7a4e280 100644 --- a/src/widgets/widgets/qlineedit_p.cpp +++ b/src/widgets/widgets/qlineedit_p.cpp @@ -533,6 +533,17 @@ QWidget *QLineEditPrivate::addAction(QAction *newAction, QAction *before, QLineE return nullptr; #endif } + + // QTBUG-59957: clear button should be the leftmost action. + if (!before && !(flags & SideWidgetClearButton) && position == QLineEdit::TrailingPosition) { + for (const SideWidgetEntry &e : trailingSideWidgets) { + if (e.flags & SideWidgetClearButton) { + before = e.action; + break; + } + } + } + // If there is a 'before' action, it takes preference // There's a bug in GHS compiler that causes internal error on the following code. diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index 330ce3a836..b7628b30e9 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -310,6 +310,7 @@ private slots: void shortcutOverrideOnReadonlyLineEdit_data(); void shortcutOverrideOnReadonlyLineEdit(); + void QTBUG59957_clearButtonLeftmostAction(); protected slots: void editingFinished(); @@ -4612,5 +4613,27 @@ void tst_QLineEdit::shortcutOverrideOnReadonlyLineEdit() QCOMPARE(spy.count(), activationCount); } +void tst_QLineEdit::QTBUG59957_clearButtonLeftmostAction() +{ + QLineEdit lineEdit; + lineEdit.setClearButtonEnabled(true); + + auto clearButton = lineEdit.findChild(); + QVERIFY(clearButton); + + QPixmap pixmap(16, 16); + lineEdit.addAction(QIcon(pixmap), QLineEdit::TrailingPosition); + lineEdit.addAction(QIcon(pixmap), QLineEdit::TrailingPosition); + + lineEdit.show(); + + const auto buttons = lineEdit.findChildren(); + for (const auto button : buttons) { + if (button == clearButton) + continue; + QVERIFY(clearButton->x() < button->x()); + } +} + QTEST_MAIN(tst_QLineEdit) #include "tst_qlineedit.moc" -- cgit v1.2.3