diff --git a/src/widgets/dialogs/qcolordialog.cpp b/src/widgets/dialogs/qcolordialog.cpp index ab6d581095c..6c2ca12825f 100644 --- a/src/widgets/dialogs/qcolordialog.cpp +++ b/src/widgets/dialogs/qcolordialog.cpp @@ -2151,7 +2151,9 @@ void QColorDialog::setVisible(bool visible) */ void QColorDialogPrivate::setVisible(bool visible) { - Q_Q(QColorDialog); + // Don't use Q_Q here! This function is called from ~QDialog, + // so Q_Q calling q_func() invokes undefined behavior (invalid cast in q_func()). + const auto q = static_cast(q_ptr); if (visible) selectedQColor = QColor(); @@ -2161,7 +2163,7 @@ void QColorDialogPrivate::setVisible(bool visible) // Set WA_DontShowOnScreen so that QDialog::setVisible(visible) below // updates the state correctly, but skips showing the non-native version: q->setAttribute(Qt::WA_DontShowOnScreen); - } else { + } else if (visible) { initWidgets(); } } else {