From b47ad83d7c84c30506b47787b58cc26a4baa214c Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Mon, 5 Feb 2024 19:42:45 +0100 Subject: Q(Plain)TextEdit: don't crash when using a style sheet When using a style sheet, Q(Plain)TextEdit::isReadOnly() might get called during the initialization before d->control is properly initialized which lead to a crash. This amends 43ce457cbd093fc06d99b5ac833c789ef7c893d5. Fixes: QTBUG-121697 Fixes: QTBUG-121790 Task-number: QTBUG-1857 Change-Id: I15c357c9eef7f6559bcc2ad89033a3d8e7fcbfef Reviewed-by: David Faure (cherry picked from commit c6af5b9c12e1ea4cec007c5efe869636ce97a9d2) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit e9b187a836974f05ba8f42eb72854a5effdc6c15) (cherry picked from commit ff1f12d5a0f57143e0e3c8d781bb3fdc884af7bc) --- src/widgets/widgets/qplaintextedit.cpp | 2 +- src/widgets/widgets/qtextedit.cpp | 2 +- .../widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp | 10 ++++++++++ tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp | 11 +++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index 134fc30964..087b7e4d21 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -2600,7 +2600,7 @@ void QPlainTextEdit::insertFromMimeData(const QMimeData *source) bool QPlainTextEdit::isReadOnly() const { Q_D(const QPlainTextEdit); - return !(d->control->textInteractionFlags() & Qt::TextEditable); + return !d->control || !(d->control->textInteractionFlags() & Qt::TextEditable); } void QPlainTextEdit::setReadOnly(bool ro) diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index d403ba73d1..b0f14cfa75 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -2213,7 +2213,7 @@ void QTextEdit::insertFromMimeData(const QMimeData *source) bool QTextEdit::isReadOnly() const { Q_D(const QTextEdit); - return !(d->control->textInteractionFlags() & Qt::TextEditable); + return !d->control || !(d->control->textInteractionFlags() & Qt::TextEditable); } void QTextEdit::setReadOnly(bool ro) diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp index 3a1d414376..e5a700298f 100644 --- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp +++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp @@ -133,6 +133,7 @@ private slots: void placeholderVisibility_data(); void placeholderVisibility(); void scrollBarSignals(); + void dontCrashWithCss(); private: void createSelection(); @@ -1944,5 +1945,14 @@ void tst_QPlainTextEdit::scrollBarSignals() QTRY_COMPARE(spy.count(), 5); } +void tst_QPlainTextEdit::dontCrashWithCss() +{ + qApp->setStyleSheet("QWidget { font: 10pt; }"); + QPlainTextEdit edit; + edit.show(); + qApp->setStyleSheet(QString()); +} + + QTEST_MAIN(tst_QPlainTextEdit) #include "tst_qplaintextedit.moc" diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp index 47e85cd839..ef9b0703b7 100644 --- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp +++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp @@ -198,6 +198,8 @@ private slots: void nextFormatAfterEnterPressed_data(); void nextFormatAfterEnterPressed(); + void dontCrashWithCss(); + private: void createSelection(); int blockCount() const; @@ -3064,5 +3066,14 @@ void tst_QTextEdit::nextFormatAfterEnterPressed() QCOMPARE(prevBlockCursor.charFormat().property(it.key()), it.value()); } +void tst_QTextEdit::dontCrashWithCss() +{ + qApp->setStyleSheet("QWidget { font: 10pt; }"); + QTextEdit edit; + edit.show(); + qApp->setStyleSheet(QString()); +} + + QTEST_MAIN(tst_QTextEdit) #include "tst_qtextedit.moc" -- cgit v1.2.3