From c7386938b43f3564b3e3a6fe5f98009e39d52e4c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 29 Jul 2014 23:32:13 +0200 Subject: QProgressDialog: make the cancel button retranslate on LanguageChange It is documented to be, and the LanguageChange event is caught and processed. However, retranslateStrings() uses QProgressDialog::setCancelButtonText(), which unconditionally sets useDefaultCancelText=true, blocking any further changes to the button text by subsequent LanguageChange events. The fix is to use extracted QProgressDialogPrivate::setCancelButtonText() which - quite intentionally - doesn't set useDefaultCancelText. Task-number: QTBUG-40504 Change-Id: I6e701deda10c454cb088c0b0778ac2d6adff574a Reviewed-by: David Faure --- src/widgets/dialogs/qprogressdialog.cpp | 3 +- .../qprogressdialog/tst_qprogressdialog.cpp | 45 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp index d160ab0ae1..35a75adea2 100644 --- a/src/widgets/dialogs/qprogressdialog.cpp +++ b/src/widgets/dialogs/qprogressdialog.cpp @@ -179,9 +179,8 @@ void QProgressDialogPrivate::layout() void QProgressDialogPrivate::retranslateStrings() { - Q_Q(QProgressDialog); if (useDefaultCancelText) - q->setCancelButtonText(QProgressDialog::tr("Cancel")); + setCancelButtonText(QProgressDialog::tr("Cancel")); } void QProgressDialogPrivate::_q_disconnectOnClose() diff --git a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp index 4ff158f632..86b9d7eee2 100644 --- a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp +++ b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp @@ -50,6 +50,7 @@ #include #include #include +#include class tst_QProgressDialog : public QObject { @@ -63,6 +64,7 @@ private Q_SLOTS: void task198202(); void QTBUG_31046(); void settingCustomWidgets(); + void i18n(); }; void tst_QProgressDialog::cleanup() @@ -234,5 +236,48 @@ void tst_QProgressDialog::settingCustomWidgets() #endif } +class QTestTranslator : public QTranslator +{ + const QString m_str; +public: + explicit QTestTranslator(QString str) : m_str(qMove(str)) {} + + QString translate(const char *, const char *sourceText, const char *, int) const Q_DECL_OVERRIDE + { return m_str + sourceText + m_str; } + + bool isEmpty() const Q_DECL_OVERRIDE { return false; } +}; + +template +class QTranslatorGuard { + Translator t; +public: + template + explicit QTranslatorGuard(Arg a) : t(qMove(a)) + { qApp->installTranslator(&t); } + ~QTranslatorGuard() + { qApp->removeTranslator(&t); } +}; + +void tst_QProgressDialog::i18n() +{ + QProgressDialog dlg; + QPushButton *btn = dlg.findChild(); + QVERIFY(btn); + const QString xxx = QStringLiteral("xxx"); + { + QTranslatorGuard guard(xxx); + { + QPushButton *btn = dlg.findChild(); + QVERIFY(btn); + QTRY_COMPARE(btn->text(), QProgressDialog::tr("Cancel")); + QVERIFY(btn->text().startsWith(xxx)); + } + } + QVERIFY(btn); + QTRY_COMPARE(btn->text(), QProgressDialog::tr("Cancel")); + QVERIFY(!btn->text().startsWith(xxx)); +} + QTEST_MAIN(tst_QProgressDialog) #include "tst_qprogressdialog.moc" -- cgit v1.2.3