📄 qdialog.cpp
字号:
pb->click(); return; } } } break; case Qt::Key_Escape: reject(); break; case Qt::Key_Up: case Qt::Key_Left: if (focusWidget() && (focusWidget()->focusPolicy() == Qt::StrongFocus || focusWidget()->focusPolicy() == Qt::WheelFocus)) { e->ignore(); break; } // call ours, since c++ blocks us from calling the one // belonging to focusWidget(). focusNextPrevChild(false); break; case Qt::Key_Down: case Qt::Key_Right: if (focusWidget() && (focusWidget()->focusPolicy() == Qt::StrongFocus || focusWidget()->focusPolicy() == Qt::WheelFocus)) { e->ignore(); break; } focusNextPrevChild(true); break; default: e->ignore(); return; } } else { e->ignore(); }}/*! \reimp */void QDialog::closeEvent(QCloseEvent *e){#ifndef QT_NO_WHATSTHIS if (isModal() && QWhatsThis::inWhatsThisMode()) QWhatsThis::leaveWhatsThisMode();#endif if (isVisible()) reject(); else e->accept();}#ifdef Q_OS_TEMP/*! \internal \reimp*/bool QDialog::event(QEvent *e){ switch (e->type()) { case QEvent::OkRequest: case QEvent::HelpRequest: { QString bName = (e->type() == QEvent::OkRequest) ? qApp->translate("QMessageBox", mb_texts[QMessageBox::Ok]) : qApp->translate("QMessageBox", "Help"); QList<QPushButton*> list = qFindChildren<QPushButton*>(this); for (int i=0; i<list.size(); ++i) { QPushButton *pb = list.at(i); if (pb->text() == bName) { if (pb->isEnabled()) pb->click(); return pb->isEnabled(); } } } default: break; } return QWidget::event(e);}#endif/***************************************************************************** Geometry management. *****************************************************************************//*! \reimp*/void QDialog::setVisible(bool visible){ Q_D(QDialog); if (visible) { if (isVisible()) return;#ifdef Q_OS_TEMP hideSpecial();#endif if (!testAttribute(Qt::WA_Moved)) { Qt::WindowStates state = windowState(); adjustPosition(parentWidget()); setAttribute(Qt::WA_Moved, false); // not really an explicit position if (state != windowState()) setWindowState(state); } QWidget::setVisible(visible); showExtension(d->doShowExtension); QWidget *fw = window()->focusWidget(); if (!fw) fw = this; /* The following block is to handle a special case, and does not really follow propper logic in concern of autoDefault and TAB order. However, it's here to ease usage for the users. If a dialog has a default QPushButton, and first widget in the TAB order also is a QPushButton, then we give focus to the main default QPushButton. This simplifies code for the developers, and actually catches most cases... If not, then they simply have to use [widget*]->setFocus() themselves... */ if (d->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 (!d->mainDef && isWindow()) { QWidget *w = fw; while ((w = w->nextInFocusChain()) != fw) { QPushButton *pb = qobject_cast<QPushButton *>(w); if (pb && pb->autoDefault() && pb->focusPolicy() != Qt::NoFocus) { pb->setDefault(true); break; } } } if (fw && !fw->hasFocus()) { QFocusEvent e(QEvent::FocusIn, Qt::TabFocusReason); QApplication::sendEvent(fw, &e); }#ifndef QT_NO_ACCESSIBILITY QAccessible::updateAccessibility(this, 0, QAccessible::DialogStart);#endif } else { if (!isVisible()) return;#ifndef QT_NO_ACCESSIBILITY if (isVisible()) QAccessible::updateAccessibility(this, 0, QAccessible::DialogEnd);#endif // Reimplemented to exit a modal event loop when the dialog is hidden. QWidget::setVisible(visible); if (d->eventLoop) d->eventLoop->exit(); }}/*!\reimp */void QDialog::showEvent(QShowEvent *event){ if (!event->spontaneous() && !testAttribute(Qt::WA_Moved)) { Qt::WindowStates state = windowState(); adjustPosition(parentWidget()); setAttribute(Qt::WA_Moved, false); // not really an explicit position if (state != windowState()) setWindowState(state); }}/*! \internal */void QDialog::adjustPosition(QWidget* w){ QPoint p(0, 0); int extraw = 0, extrah = 0, scrn = 0; if (w) w = w->window(); QRect desk; if (w) { scrn = QApplication::desktop()->screenNumber(w); } else if (QApplication::desktop()->isVirtualDesktop()) { scrn = QApplication::desktop()->screenNumber(QCursor::pos()); } else { scrn = QApplication::desktop()->screenNumber(this); } desk = QApplication::desktop()->availableGeometry(scrn); QWidgetList list = QApplication::topLevelWidgets(); for (int i = 0; (extraw == 0 || extrah == 0) && i < list.size(); ++i) { QWidget * current = list.at(i); if (current->isVisible()) { int framew = current->geometry().x() - current->x(); int frameh = current->geometry().y() - current->y(); extraw = qMax(extraw, framew); extrah = qMax(extrah, frameh); } } // sanity check for decoration frames. With embedding, we // might get extraordinary values if (extraw == 0 || extrah == 0 || extraw >= 10 || extrah >= 40) { extrah = 40; extraw = 10; }#ifndef Q_OS_TEMP if (w) { // Use mapToGlobal rather than geometry() in case w might // be embedded in another application QPoint pp = w->mapToGlobal(QPoint(0,0)); p = QPoint(pp.x() + w->width()/2, pp.y() + w->height()/ 2); } else { // p = middle of the desktop p = QPoint(desk.x() + desk.width()/2, desk.y() + desk.height()/2); }#else p = QPoint(desk.x() + desk.width()/2, desk.y() + desk.height()/2);#endif // p = origin of this p = QPoint(p.x()-width()/2 - extraw, p.y()-height()/2 - extrah); if (p.x() + extraw + width() > desk.x() + desk.width()) p.setX(desk.x() + desk.width() - width() - extraw); if (p.x() < desk.x()) p.setX(desk.x()); if (p.y() + extrah + height() > desk.y() + desk.height()) p.setY(desk.y() + desk.height() - height() - extrah); if (p.y() < desk.y()) p.setY(desk.y()); move(p);}/*! If \a orientation is Qt::Horizontal, the extension will be displayed to the right of the dialog's main area. If \a orientation is Qt::Vertical, the extension will be displayed below the dialog's main area. \sa orientation(), setExtension()*/void QDialog::setOrientation(Qt::Orientation orientation){ Q_D(QDialog); d->orientation = orientation;}/*! Returns the dialog's extension orientation. \sa setOrientation()*/Qt::Orientation QDialog::orientation() const{ Q_D(const QDialog); return d->orientation;}/*! Sets the widget, \a extension, to be the dialog's extension, deleting any previous extension. The dialog takes ownership of the extension. Note that if 0 is passed any existing extension will be deleted. This function must only be called while the dialog is hidden. \sa showExtension(), setOrientation(), extension() */void QDialog::setExtension(QWidget* extension){ Q_D(QDialog); delete d->extension; d->extension = extension; if (!extension) return; if (extension->parentWidget() != this) extension->setParent(this); extension->hide();}/*! Returns the dialog's extension or 0 if no extension has been defined. \sa setExtension() */QWidget* QDialog::extension() const{ Q_D(const QDialog); return d->extension;}/*! If \a showIt is true, the dialog's extension is shown; otherwise the extension is hidden. This slot is usually connected to the \l QPushButton::toggled() signal of a QPushButton. A dialog with a visible extension is not resizeable. \sa show(), setExtension(), setOrientation() */void QDialog::showExtension(bool showIt){ Q_D(QDialog); d->doShowExtension = showIt; if (!d->extension) return; if (!testAttribute(Qt::WA_WState_Visible)) return; if (d->extension->isVisible() == showIt) return; if (showIt) { d->size = size(); d->min = minimumSize(); d->max = maximumSize(); if (layout()) layout()->setEnabled(false); QSize s(d->extension->sizeHint() .expandedTo(d->extension->minimumSize()) .boundedTo(d->extension->maximumSize())); if (d->orientation == Qt::Horizontal) { int h = qMax(height(), s.height()); d->extension->setGeometry(width(), 0, s.width(), h); setFixedSize(width() + s.width(), h); } else { int w = qMax(width(), s.width()); d->extension->setGeometry(0, height(), w, s.height()); setFixedSize(w, height() + s.height()); } d->extension->show(); } else { d->extension->hide(); // workaround for CDE window manager that won't shrink with (-1,-1) setMinimumSize(d->min.expandedTo(QSize(1, 1))); setMaximumSize(d->max); resize(d->size); if (layout()) layout()->setEnabled(true); }}/*! \reimp */QSize QDialog::sizeHint() const{ Q_D(const QDialog); if (d->extension) if (d->orientation == Qt::Horizontal) return QSize(QWidget::sizeHint().width(), qMax(QWidget::sizeHint().height(),d->extension->sizeHint().height())); else return QSize(qMax(QWidget::sizeHint().width(), d->extension->sizeHint().width()), QWidget::sizeHint().height()); return QWidget::sizeHint();}/*! \reimp */QSize QDialog::minimumSizeHint() const{ Q_D(const QDialog); if (d->extension) if (d->orientation == Qt::Horizontal) return QSize(QWidget::minimumSizeHint().width(), qMax(QWidget::minimumSizeHint().height(), d->extension->minimumSizeHint().height())); else return QSize(qMax(QWidget::minimumSizeHint().width(), d->extension->minimumSizeHint().width()), QWidget::minimumSizeHint().height()); return QWidget::minimumSizeHint();}/*! \property QDialog::modal \brief whether show() should pop up the dialog as modal or modeless By default, this property is false and show() pops up the dialog as modeless. Setting his property to true is equivalent to setting QWidget::windowModality to Qt::ApplicationModal. exec() ignores the value of this property and always pops up the dialog as modal. \sa QWidget::windowModality, show(), exec()*/void QDialog::setModal(bool modal){ setAttribute(Qt::WA_ShowModal, modal);}bool QDialog::isSizeGripEnabled() const{#ifndef QT_NO_SIZEGRIP Q_D(const QDialog); return !!d->resizer;#else return false;#endif}void QDialog::setSizeGripEnabled(bool enabled){#ifdef QT_NO_SIZEGRIP Q_UNUSED(enabled);#else Q_D(QDialog); if (!enabled != !d->resizer) { if (enabled) { d->resizer = new QSizeGrip(this); // adjustSize() processes all events, which is suboptimal d->resizer->resize(d->resizer->sizeHint()); if (isRightToLeft()) d->resizer->move(rect().bottomLeft() -d->resizer->rect().bottomLeft()); else d->resizer->move(rect().bottomRight() -d->resizer->rect().bottomRight()); d->resizer->lower(); d->resizer->show(); } else { delete d->resizer; d->resizer = 0; } }#endif //QT_NO_SIZEGRIP}/*! \reimp */void QDialog::resizeEvent(QResizeEvent *){#ifndef QT_NO_SIZEGRIP Q_D(QDialog); if (d->resizer) { if (isRightToLeft()) d->resizer->move(rect().bottomLeft() -d->resizer->rect().bottomLeft()); else d->resizer->move(rect().bottomRight() -d->resizer->rect().bottomRight()); d->resizer->lower(); }#endif}/*! \fn void QDialog::finished(int result) \since 4.1 This signal is emitted when the dialog's \a result code has been set, either by the user or by calling done(), accept(), or reject(). Note that this signal is \e not emitted when hiding the dialog with hide() or setVisible(false). This includes deleting the dialog while it is visible. \sa accepted(), rejected()*//*! \fn void QDialog::accepted() \since 4.1 This signal is emitted when the dialog has been accepted either by the user or by calling accept() or done() with the QDialog::Accepted argument. Note that this signal is \e not emitted when hiding the dialog with hide() or setVisible(false). This includes deleting the dialog while it is visible. \sa finished(), rejected()*//*! \fn void QDialog::rejected() \since 4.1 This signal is emitted when the dialog has been rejected either by the user or by calling reject() or done() with the QDialog::Rejected argument. Note that this signal is \e not emitted when hiding the dialog with hide() or setVisible(false). This includes deleting the dialog while it is visible. \sa finished(), accepted()*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -