diff options
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/doc/src/model-view-programming.qdoc | 2 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsitem.cpp | 11 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsview.cpp | 1 | ||||
-rw-r--r-- | src/widgets/kernel/qdesktopwidget.h | 1 | ||||
-rw-r--r-- | src/widgets/kernel/qdesktopwidget_qpa.cpp | 44 | ||||
-rw-r--r-- | src/widgets/kernel/qdesktopwidget_qpa_p.h | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 5 | ||||
-rw-r--r-- | src/widgets/styles/qmacstyle_mac.mm | 2 | ||||
-rw-r--r-- | src/widgets/util/qcompleter.cpp | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qcombobox.cpp | 31 | ||||
-rw-r--r-- | src/widgets/widgets/qcombobox.h | 4 | ||||
-rw-r--r-- | src/widgets/widgets/qcombobox_p.h | 4 | ||||
-rw-r--r-- | src/widgets/widgets/qdockarealayout.cpp | 2 |
14 files changed, 82 insertions, 30 deletions
diff --git a/src/widgets/doc/src/model-view-programming.qdoc b/src/widgets/doc/src/model-view-programming.qdoc index 6bcd0943a1..377ecf204e 100644 --- a/src/widgets/doc/src/model-view-programming.qdoc +++ b/src/widgets/doc/src/model-view-programming.qdoc @@ -189,7 +189,7 @@ to the QTableView::sortByColumn() slot or the QTreeView::sortByColumn() slot, respectively. - The alternative approach, if your model do not have the required + The alternative approach, if your model does not have the required interface or if you want to use a list view to present your data, is to use a proxy model to transform the structure of your model before presenting the data in the view. This is covered in detail diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index 1c15905ff0..db2b71f508 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -4199,9 +4199,14 @@ QTransform QGraphicsItem::deviceTransform(const QTransform &viewportTransform) c return QTransform(); } - // First translate the base untransformable item. - untransformedAncestor->d_ptr->ensureSceneTransform(); - QPointF mappedPoint = (untransformedAncestor->d_ptr->sceneTransform * viewportTransform).map(QPointF(0, 0)); + // Determine the inherited origin. Find the parent of the topmost untransformable. + // Use its scene transform to map the position of the untransformable. Then use + // that viewport position as the anchoring point for the untransformable subtree. + QGraphicsItem *parentOfUntransformedAncestor = untransformedAncestor->parentItem(); + QTransform inheritedMatrix; + if (parentOfUntransformedAncestor) + inheritedMatrix = parentOfUntransformedAncestor->sceneTransform(); + QPointF mappedPoint = (inheritedMatrix * viewportTransform).map(untransformedAncestor->pos()); // COMBINE QTransform matrix = QTransform::fromTranslate(mappedPoint.x(), mappedPoint.y()); diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp index d78e32205f..846858ab31 100644 --- a/src/widgets/graphicsview/qgraphicsview.cpp +++ b/src/widgets/graphicsview/qgraphicsview.cpp @@ -3214,7 +3214,6 @@ void QGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) mouseEvent.setLastScenePos(d->lastMouseMoveScenePoint); mouseEvent.setLastScreenPos(d->lastMouseMoveScreenPoint); mouseEvent.setButtons(event->buttons()); - mouseEvent.setButtons(event->buttons()); mouseEvent.setAccepted(false); mouseEvent.setButton(event->button()); mouseEvent.setModifiers(event->modifiers()); diff --git a/src/widgets/kernel/qdesktopwidget.h b/src/widgets/kernel/qdesktopwidget.h index da44242b86..42c338f696 100644 --- a/src/widgets/kernel/qdesktopwidget.h +++ b/src/widgets/kernel/qdesktopwidget.h @@ -92,6 +92,7 @@ protected: private: Q_DISABLE_COPY(QDesktopWidget) Q_DECLARE_PRIVATE(QDesktopWidget) + Q_PRIVATE_SLOT(d_func(), void _q_updateScreens()) friend class QApplication; friend class QApplicationPrivate; diff --git a/src/widgets/kernel/qdesktopwidget_qpa.cpp b/src/widgets/kernel/qdesktopwidget_qpa.cpp index 64236321a4..015573dfbe 100644 --- a/src/widgets/kernel/qdesktopwidget_qpa.cpp +++ b/src/widgets/kernel/qdesktopwidget_qpa.cpp @@ -49,12 +49,13 @@ QT_BEGIN_NAMESPACE QT_USE_NAMESPACE -void QDesktopWidgetPrivate::updateScreenList() +void QDesktopWidgetPrivate::_q_updateScreens() { Q_Q(QDesktopWidget); - QList<QScreen *> screenList = QGuiApplication::screens(); - int targetLength = screenList.length(); - int currentLength = screens.length(); + const QList<QScreen *> screenList = QGuiApplication::screens(); + const int targetLength = screenList.length(); + const int oldLength = screens.length(); + int currentLength = oldLength; // Add or remove screen widgets as necessary if(currentLength > targetLength) { @@ -65,23 +66,41 @@ void QDesktopWidgetPrivate::updateScreenList() } } else if (currentLength < targetLength) { - QDesktopScreenWidget *screen; while (currentLength < targetLength) { - screen = new QDesktopScreenWidget(currentLength++); - screens.append(screen); + QScreen *qScreen = screenList.at(currentLength); + QDesktopScreenWidget *screenWidget = new QDesktopScreenWidget(currentLength++); + screenWidget->setGeometry(qScreen->geometry()); + QObject::connect(qScreen, SIGNAL(geometryChanged(QRect)), + q, SLOT(_q_updateScreens()), Qt::QueuedConnection); + QObject::connect(qScreen, SIGNAL(destroyed()), + q, SLOT(_q_updateScreens()), Qt::QueuedConnection); + screens.append(screenWidget); } } QRegion virtualGeometry; - // update the geometry of each screen widget + // update the geometry of each screen widget, determine virtual geometry + // and emit change signals afterwards. + QList<int> changedScreens; for (int i = 0; i < screens.length(); i++) { - QRect screenGeometry = screenList.at(i)->geometry(); - screens.at(i)->setGeometry(screenGeometry); + const QRect screenGeometry = screenList.at(i)->geometry(); + if (screenGeometry != screens.at(i)->geometry()) { + screens.at(i)->setGeometry(screenGeometry); + changedScreens.push_back(i); + } virtualGeometry += screenGeometry; } q->setGeometry(virtualGeometry.boundingRect()); + + if (oldLength != targetLength) + emit q->screenCountChanged(targetLength); + + foreach (int changedScreen, changedScreens) { + emit q->resized(changedScreen); + emit q->workAreaResized(changedScreen); + } } QDesktopWidget::QDesktopWidget() @@ -89,7 +108,8 @@ QDesktopWidget::QDesktopWidget() { Q_D(QDesktopWidget); setObjectName(QLatin1String("desktop")); - d->updateScreenList(); + d->_q_updateScreens(); + connect(qApp, SIGNAL(screenAdded(QScreen*)), this, SLOT(_q_updateScreens())); } QDesktopWidget::~QDesktopWidget() @@ -169,3 +189,5 @@ void QDesktopWidget::resizeEvent(QResizeEvent *) } QT_END_NAMESPACE + +#include "moc_qdesktopwidget.cpp" diff --git a/src/widgets/kernel/qdesktopwidget_qpa_p.h b/src/widgets/kernel/qdesktopwidget_qpa_p.h index 017934fbf1..f461869f1b 100644 --- a/src/widgets/kernel/qdesktopwidget_qpa_p.h +++ b/src/widgets/kernel/qdesktopwidget_qpa_p.h @@ -74,7 +74,7 @@ class QDesktopWidgetPrivate : public QWidgetPrivate { public: ~QDesktopWidgetPrivate() {foreach(QDesktopScreenWidget *s, screens) delete s; } - void updateScreenList(); + void _q_updateScreens(); QList<QDesktopScreenWidget *> screens; }; diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 7cb0979c06..49d64c5cd8 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -1401,7 +1401,7 @@ QWidget::~QWidget() w = w->d_func()->extra->focus_proxy; QWidget *window = w->window(); QWExtra *e = window ? window->d_func()->extra : 0; - if (!e || !e->proxyWidget) + if (!e || !e->proxyWidget || (w->parentWidget() && w->parentWidget()->d_func()->focus_child == this)) #endif clearFocus(); } QT_CATCH(...) { diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 18dd3156c6..675ea77b30 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -538,9 +538,10 @@ void QWidgetWindow::handleResizeEvent(QResizeEvent *event) } } -void QWidgetWindow::handleCloseEvent(QCloseEvent *) +void QWidgetWindow::handleCloseEvent(QCloseEvent *event) { - m_widget->d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent); + bool is_closing = m_widget->d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent); + event->setAccepted(is_closing); } #ifndef QT_NO_WHEELEVENT diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 9119e2cfba..0b860450d1 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -3741,6 +3741,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter comboCopy.direction = Qt::LeftToRight; if ((opt->state & QStyle::State_Small) && QSysInfo::macVersion() > QSysInfo::MV_10_6) comboCopy.rect.translate(0, w ? -1 : -2); // Supports Qt Quick Controls + else if (QSysInfo::macVersion() > QSysInfo::MV_10_8) + comboCopy.rect.translate(0, 1); QCommonStyle::drawControl(CE_ComboBoxLabel, &comboCopy, p, w); } break; diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp index 64b7b12e90..18c8ed2bd2 100644 --- a/src/widgets/util/qcompleter.cpp +++ b/src/widgets/util/qcompleter.cpp @@ -829,6 +829,7 @@ void QCompleterPrivate::_q_complete(QModelIndex index, bool highlighted) if (!index.isValid() || (!proxy->showAll && (index.row() >= proxy->engine->matchCount()))) { completion = prefix; + index = QModelIndex(); } else { if (!(index.flags() & Qt::ItemIsEnabled)) return; diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index c59edf295c..afe8f1c3f4 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -59,6 +59,7 @@ #include <qheaderview.h> #include <qmath.h> #include <qmetaobject.h> +#include <qabstractproxymodel.h> #include <private/qguiapplication_p.h> #include <private/qapplication_p.h> #include <private/qcombobox_p.h> @@ -173,18 +174,28 @@ QStyleOptionMenuItem QComboMenuDelegate::getStyleOption(const QStyleOptionViewIt return menuOption; } -#ifdef QT_KEYPAD_NAVIGATION -void QComboBoxPrivate::_q_completerActivated() +#ifndef QT_NO_COMPLETER +void QComboBoxPrivate::_q_completerActivated(const QModelIndex &index) { Q_Q(QComboBox); + if (index.isValid() && q->completer()) { + QAbstractProxyModel *proxy = qobject_cast<QAbstractProxyModel *>(q->completer()->completionModel()); + if (proxy) { + q->setCurrentIndex(proxy->mapToSource(index).row()); + emitActivated(currentIndex); + } + } + +# ifdef QT_KEYPAD_NAVIGATION if ( QApplication::keypadNavigationEnabled() && q->isEditable() && q->completer() && q->completer()->completionMode() == QCompleter::UnfilteredPopupCompletion ) { q->setEditFocus(false); } +# endif // QT_KEYPAD_NAVIGATION } -#endif +#endif // !QT_NO_COMPLETER void QComboBoxPrivate::updateArrow(QStyle::StateFlag state) { @@ -1149,6 +1160,14 @@ void QComboBoxPrivate::_q_editingFinished() void QComboBoxPrivate::_q_returnPressed() { Q_Q(QComboBox); + + // The insertion code below does not apply when the policy is QComboBox::NoInsert. + // In case a completer is installed, item activation via the completer is handled + // in _q_completerActivated(). Otherwise _q_editingFinished() updates the current + // index as appropriate. + if (insertPolicy == QComboBox::NoInsert) + return; + if (lineEdit && !lineEdit->text().isEmpty()) { if (q->count() >= maxCount && !(this->insertPolicy == QComboBox::InsertAtCurrent)) return; @@ -1191,7 +1210,6 @@ void QComboBoxPrivate::_q_returnPressed() break; } break; - case QComboBox::NoInsert: default: break; } @@ -1393,6 +1411,7 @@ void QComboBox::setAutoCompletion(bool enable) if (d->lineEdit->completer()) return; d->completer = new QCompleter(d->model, d->lineEdit); + connect(d->completer, SIGNAL(activated(QModelIndex)), this, SLOT(_q_completerActivated(QModelIndex))); d->completer->setCaseSensitivity(d->autoCompletionCaseSensitivity); d->completer->setCompletionMode(QCompleter::InlineCompletion); d->completer->setCompletionColumn(d->modelColumn); @@ -1805,8 +1824,10 @@ void QComboBox::setCompleter(QCompleter *c) if (!d->lineEdit) return; d->lineEdit->setCompleter(c); - if (c) + if (c) { + connect(c, SIGNAL(activated(QModelIndex)), this, SLOT(_q_completerActivated(QModelIndex))); c->setWidget(this); + } } /*! diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h index d167ac7d11..2fafe79f7a 100644 --- a/src/widgets/widgets/qcombobox.h +++ b/src/widgets/widgets/qcombobox.h @@ -259,8 +259,8 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_rowsRemoved(const QModelIndex & parent, int start, int end)) Q_PRIVATE_SLOT(d_func(), void _q_modelDestroyed()) Q_PRIVATE_SLOT(d_func(), void _q_modelReset()) -#ifdef QT_KEYPAD_NAVIGATION - Q_PRIVATE_SLOT(d_func(), void _q_completerActivated()) +#ifndef QT_NO_COMPLETER + Q_PRIVATE_SLOT(d_func(), void _q_completerActivated(const QModelIndex &index)) #endif }; diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h index 14cf9e7925..07ba9b0925 100644 --- a/src/widgets/widgets/qcombobox_p.h +++ b/src/widgets/widgets/qcombobox_p.h @@ -348,8 +348,8 @@ public: void _q_emitCurrentIndexChanged(const QModelIndex &index); void _q_modelDestroyed(); void _q_modelReset(); -#ifdef QT_KEYPAD_NAVIGATION - void _q_completerActivated(); +#ifndef QT_NO_COMPLETER + void _q_completerActivated(const QModelIndex &index); #endif void _q_resetButton(); void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index ac061e7071..72a463b30b 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -1471,7 +1471,7 @@ QList<int> QDockAreaLayoutInfo::indexOf(QWidget *widget) const continue; } - if (!(item.flags & QDockAreaLayoutItem::GapItem) && item.widgetItem->widget() == widget) { + if (!(item.flags & QDockAreaLayoutItem::GapItem) && item.widgetItem && item.widgetItem->widget() == widget) { QList<int> result; result << i; return result; |