diff options
Diffstat (limited to 'src/widgets/dialogs/qdialog.cpp')
-rw-r--r-- | src/widgets/dialogs/qdialog.cpp | 126 |
1 files changed, 64 insertions, 62 deletions
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp index 4384df0e7f..27466d03d6 100644 --- a/src/widgets/dialogs/qdialog.cpp +++ b/src/widgets/dialogs/qdialog.cpp @@ -98,6 +98,9 @@ QPlatformDialogHelper *QDialogPrivate::platformHelper() const bool QDialogPrivate::canBeNativeDialog() const { + if (QCoreApplication::testAttribute(Qt::AA_DontUseNativeDialogs)) + return false; + QDialogPrivate *ncThis = const_cast<QDialogPrivate *>(this); QDialog *dialog = ncThis->q_func(); const int type = themeDialogType(dialog); @@ -146,25 +149,6 @@ void QDialogPrivate::close(int resultCode) resetModalitySetByOpen(); } -/*! - \internal - - Emits finished() signal with \a resultCode. If the \a dialogCode - is equal to 0 emits rejected(), if the \a dialogCode is equal to - 1 emits accepted(). - */ -void QDialogPrivate::finalize(int resultCode, int dialogCode) -{ - Q_Q(QDialog); - - if (dialogCode == QDialog::Accepted) - emit q->accepted(); - else if (dialogCode == QDialog::Rejected) - emit q->rejected(); - - emit q->finished(resultCode); -} - QWindow *QDialogPrivate::transientParentWindow() const { Q_Q(const QDialog); @@ -196,14 +180,6 @@ QVariant QDialogPrivate::styleHint(QPlatformDialogHelper::StyleHint hint) const return QPlatformDialogHelper::defaultStyleHint(hint); } -void QDialogPrivate::deletePlatformHelper() -{ - delete m_platformHelper; - m_platformHelper = nullptr; - m_platformHelperCreated = false; - nativeDialogInUse = false; -} - /*! \class QDialog \brief The QDialog class is the base class of dialog windows. @@ -304,7 +280,8 @@ void QDialogPrivate::deletePlatformHelper() \section1 Escape Key If the user presses the Esc key in a dialog, QDialog::reject() - will be called. This will cause the window to close: The \l{QCloseEvent}{close event} cannot be \l{QEvent::ignore()}{ignored}. + will be called. This will cause the window to close: + The \l{QCloseEvent}{close event} cannot be \l{QEvent::ignore()}{ignored}. \section1 Extensibility @@ -312,9 +289,8 @@ void QDialogPrivate::deletePlatformHelper() partial dialog that shows the most commonly used options, and a full dialog that shows all the options. Typically an extensible dialog will initially appear as a partial dialog, but with a - \uicontrol More toggle button. If the user presses the \uicontrol More button down, - the dialog is expanded. The \l{Extension Example} shows how to achieve - extensible dialogs using Qt. + \uicontrol More toggle button. If the user presses the + \uicontrol More button down, the dialog is expanded. \target return \section1 Return Value (Modal Dialogs) @@ -344,7 +320,15 @@ void QDialogPrivate::deletePlatformHelper() \snippet dialogs/dialogs.cpp 0 - \sa QDialogButtonBox, QTabWidget, QWidget, QProgressDialog, {Extension Example}, + A dialog with an extension: + + \snippet dialogs/dialogs.cpp extension + + By setting the \l{QLayout::}{sizeConstraint} property of the dialog's + layout to \l{QLayout::}{SetFixedSize}, the dialog will not be resizable + by the user, and will automatically shrink when the extension gets hidden. + + \sa QDialogButtonBox, QTabWidget, QWidget, QProgressDialog, {Standard Dialogs Example} */ @@ -617,9 +601,22 @@ int QDialog::exec() void QDialog::done(int r) { + QPointer<QDialog> guard(this); + Q_D(QDialog); d->close(r); - d->finalize(r, r); + + if (!guard) + return; + + int dialogCode = d->dialogCode(); + if (dialogCode == QDialog::Accepted) + emit accepted(); + else if (dialogCode == QDialog::Rejected) + emit rejected(); + + if (guard) + emit finished(r); } /*! @@ -747,35 +744,42 @@ void QDialog::closeEvent(QCloseEvent *e) void QDialog::setVisible(bool visible) { Q_D(QDialog); - if (!testAttribute(Qt::WA_DontShowOnScreen) && d->canBeNativeDialog() && d->setNativeDialogVisible(visible)) + + if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden) != visible) + return; + + d->setVisible(visible); +} + +void QDialogPrivate::setVisible(bool visible) +{ + Q_Q(QDialog); + if (!q->testAttribute(Qt::WA_DontShowOnScreen) && canBeNativeDialog() && setNativeDialogVisible(visible)) return; // We should not block windows by the invisible modal dialog // if a platform-specific dialog is implemented as an in-process // Qt window, because in this case it will also be blocked. - const bool dontBlockWindows = testAttribute(Qt::WA_DontShowOnScreen) - && d->styleHint(QPlatformDialogHelper::DialogIsQtWindow).toBool(); + const bool dontBlockWindows = q->testAttribute(Qt::WA_DontShowOnScreen) + && styleHint(QPlatformDialogHelper::DialogIsQtWindow).toBool(); Qt::WindowModality oldModality; bool wasModalitySet; if (dontBlockWindows) { - oldModality = windowModality(); - wasModalitySet = testAttribute(Qt::WA_SetWindowModality); - setWindowModality(Qt::NonModal); + oldModality = q->windowModality(); + wasModalitySet = q->testAttribute(Qt::WA_SetWindowModality); + q->setWindowModality(Qt::NonModal); } if (visible) { - if (testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden)) - return; - - QWidget::setVisible(visible); + q->QWidget::setVisible(visible); // Window activation might be prevented. We can't test isActiveWindow here, // as the window will be activated asynchronously by the window manager. - if (!testAttribute(Qt::WA_ShowWithoutActivating)) { - QWidget *fw = window()->focusWidget(); + if (!q->testAttribute(Qt::WA_ShowWithoutActivating)) { + QWidget *fw = q->window()->focusWidget(); if (!fw) - fw = this; + fw = q; /* The following block is to handle a special case, and does not @@ -788,14 +792,14 @@ void QDialog::setVisible(bool visible) have to use [widget*]->setFocus() themselves... */ #if QT_CONFIG(pushbutton) - if (d->mainDef && fw->focusPolicy() == Qt::NoFocus) { + if (mainDef && fw->focusPolicy() == Qt::NoFocus) { QWidget *first = fw; while ((first = first->nextInFocusChain()) != fw && first->focusPolicy() == Qt::NoFocus) ; - if (first != d->mainDef && qobject_cast<QPushButton*>(first)) - d->mainDef->setFocus(); + if (first != mainDef && qobject_cast<QPushButton*>(first)) + mainDef->setFocus(); } - if (!d->mainDef && isWindow()) { + if (!mainDef && q->isWindow()) { QWidget *w = fw; while ((w = w->nextInFocusChain()) != fw) { QPushButton *pb = qobject_cast<QPushButton *>(w); @@ -813,37 +817,35 @@ void QDialog::setVisible(bool visible) } #if QT_CONFIG(accessibility) - QAccessibleEvent event(this, QAccessible::DialogStart); + QAccessibleEvent event(q, QAccessible::DialogStart); QAccessible::updateAccessibility(&event); #endif } else { - if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden)) - return; #if QT_CONFIG(accessibility) - if (isVisible()) { - QAccessibleEvent event(this, QAccessible::DialogEnd); + if (q->isVisible()) { + QAccessibleEvent event(q, QAccessible::DialogEnd); QAccessible::updateAccessibility(&event); } #endif // Reimplemented to exit a modal event loop when the dialog is hidden. - QWidget::setVisible(visible); - if (d->eventLoop) - d->eventLoop->exit(); + q->QWidget::setVisible(visible); + if (eventLoop) + eventLoop->exit(); } if (dontBlockWindows) { - setWindowModality(oldModality); - setAttribute(Qt::WA_SetWindowModality, wasModalitySet); + q->setWindowModality(oldModality); + q->setAttribute(Qt::WA_SetWindowModality, wasModalitySet); } #if QT_CONFIG(pushbutton) const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme(); - if (d->mainDef && isActiveWindow() + if (mainDef && q->isActiveWindow() && theme->themeHint(QPlatformTheme::DialogSnapToDefaultButton).toBool()) - QCursor::setPos(d->mainDef->mapToGlobal(d->mainDef->rect().center())); + QCursor::setPos(mainDef->mapToGlobal(mainDef->rect().center())); #endif } |