diff options
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/itemviews.pri | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemdelegate.cpp | 118 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemdelegate.h | 3 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemdelegate_p.h | 70 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemview.cpp | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemview.h | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qitemdelegate.cpp | 109 | ||||
-rw-r--r-- | src/widgets/itemviews/qitemdelegate.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget.cpp | 19 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget_p.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qstyleditemdelegate.cpp | 103 | ||||
-rw-r--r-- | src/widgets/itemviews/qstyleditemdelegate.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 19 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget_p.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview.cpp | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview_p.h | 2 |
16 files changed, 241 insertions, 220 deletions
diff --git a/src/widgets/itemviews/itemviews.pri b/src/widgets/itemviews/itemviews.pri index 4e152d18bb..2bbf7ac1ff 100644 --- a/src/widgets/itemviews/itemviews.pri +++ b/src/widgets/itemviews/itemviews.pri @@ -12,6 +12,7 @@ HEADERS += \ itemviews/qtreeview.h \ itemviews/qtreeview_p.h \ itemviews/qabstractitemdelegate.h \ + itemviews/qabstractitemdelegate_p.h \ itemviews/qitemdelegate.h \ itemviews/qdirmodel.h \ itemviews/qlistwidget.h \ diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp index 4dffa6efe7..4d0840c3d6 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.cpp +++ b/src/widgets/itemviews/qabstractitemdelegate.cpp @@ -42,7 +42,17 @@ #include <qevent.h> #include <qstring.h> #include <qdebug.h> +#include <qlineedit.h> +#include <qtextedit.h> +#include <qplaintextedit.h> +#include <qapplication.h> #include <private/qtextengine_p.h> +#include <private/qabstractitemdelegate_p.h> + +#include <qpa/qplatformintegration.h> +#include <qpa/qplatformdrag.h> +#include <private/qguiapplication_p.h> +#include <private/qdnd_p.h> QT_BEGIN_NAMESPACE @@ -165,7 +175,7 @@ QT_BEGIN_NAMESPACE Creates a new abstract item delegate with the given \a parent. */ QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent) - : QObject(parent) + : QObject(*new QAbstractItemDelegatePrivate, parent) { } @@ -405,6 +415,112 @@ QVector<int> QAbstractItemDelegate::paintingRoles() const return QVector<int>(); } +QAbstractItemDelegatePrivate::QAbstractItemDelegatePrivate() + : QObjectPrivate() +{ +} + +bool QAbstractItemDelegatePrivate::editorEventFilter(QObject *object, QEvent *event) +{ + Q_Q(QAbstractItemDelegate); + + QWidget *editor = qobject_cast<QWidget*>(object); + if (!editor) + return false; + if (event->type() == QEvent::KeyPress) { + switch (static_cast<QKeyEvent *>(event)->key()) { + case Qt::Key_Tab: + if (tryFixup(editor)) { + emit q->commitData(editor); + emit q->closeEditor(editor, QAbstractItemDelegate::EditNextItem); + } + return true; + case Qt::Key_Backtab: + if (tryFixup(editor)) { + emit q->commitData(editor); + emit q->closeEditor(editor, QAbstractItemDelegate::EditPreviousItem); + } + return true; + case Qt::Key_Enter: + case Qt::Key_Return: +#ifndef QT_NO_TEXTEDIT + if (qobject_cast<QTextEdit *>(editor) || qobject_cast<QPlainTextEdit *>(editor)) + return false; // don't filter enter key events for QTextEdit or QPlainTextEdit +#endif // QT_NO_TEXTEDIT + // We want the editor to be able to process the key press + // before committing the data (e.g. so it can do + // validation/fixup of the input). + if (!tryFixup(editor)) + return true; + + QMetaObject::invokeMethod(q, "_q_commitDataAndCloseEditor", + Qt::QueuedConnection, Q_ARG(QWidget*, editor)); + return false; + case Qt::Key_Escape: + // don't commit data + emit q->closeEditor(editor, QAbstractItemDelegate::RevertModelCache); + return true; + default: + return false; + } + } else if (event->type() == QEvent::FocusOut || (event->type() == QEvent::Hide && editor->isWindow())) { + //the Hide event will take care of he editors that are in fact complete dialogs + if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { + QWidget *w = QApplication::focusWidget(); + while (w) { // don't worry about focus changes internally in the editor + if (w == editor) + return false; + w = w->parentWidget(); + } +#ifndef QT_NO_DRAGANDDROP + // The window may lose focus during an drag operation. + // i.e when dragging involves the taskbar on Windows. + QPlatformDrag *platformDrag = QGuiApplicationPrivate::instance()->platformIntegration()->drag(); + if (platformDrag && platformDrag->currentDrag()) { + return false; + } +#endif + if (tryFixup(editor)) + emit q->commitData(editor); + + emit q->closeEditor(editor, QAbstractItemDelegate::NoHint); + } + } else if (event->type() == QEvent::ShortcutOverride) { + if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { + event->accept(); + return true; + } + } + return false; +} + +bool QAbstractItemDelegatePrivate::tryFixup(QWidget *editor) +{ +#ifndef QT_NO_LINEEDIT + if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) { + if (!e->hasAcceptableInput()) { + if (const QValidator *validator = e->validator()) { + QString text = e->text(); + validator->fixup(text); + e->setText(text); + } + return e->hasAcceptableInput(); + } + } +#endif // QT_NO_LINEEDIT + + return true; +} + +void QAbstractItemDelegatePrivate::_q_commitDataAndCloseEditor(QWidget *editor) +{ + Q_Q(QAbstractItemDelegate); + emit q->commitData(editor); + emit q->closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); +} + QT_END_NAMESPACE +#include "moc_qabstractitemdelegate.cpp" + #endif // QT_NO_ITEMVIEWS diff --git a/src/widgets/itemviews/qabstractitemdelegate.h b/src/widgets/itemviews/qabstractitemdelegate.h index 9bce527bdc..8cd902f58e 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.h +++ b/src/widgets/itemviews/qabstractitemdelegate.h @@ -47,6 +47,7 @@ class QModelIndex; class QAbstractItemModel; class QAbstractItemView; class QHelpEvent; +class QAbstractItemDelegatePrivate; class Q_WIDGETS_EXPORT QAbstractItemDelegate : public QObject { @@ -114,7 +115,9 @@ Q_SIGNALS: protected: QAbstractItemDelegate(QObjectPrivate &, QObject *parent = 0); private: + Q_DECLARE_PRIVATE(QAbstractItemDelegate) Q_DISABLE_COPY(QAbstractItemDelegate) + Q_PRIVATE_SLOT(d_func(), void _q_commitDataAndCloseEditor(QWidget*)) }; #endif // QT_NO_ITEMVIEWS diff --git a/src/widgets/itemviews/qabstractitemdelegate_p.h b/src/widgets/itemviews/qabstractitemdelegate_p.h new file mode 100644 index 0000000000..debc9f5926 --- /dev/null +++ b/src/widgets/itemviews/qabstractitemdelegate_p.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWidgets module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QABSTRACTITEMDELEGATE_P_H +#define QABSTRACTITEMDELEGATE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qabstractitemdelegate.h" +#include <private/qobject_p.h> + +#ifndef QT_NO_ITEMVIEWS + +QT_BEGIN_NAMESPACE + +class QAbstractItemDelegatePrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QAbstractItemDelegate) +public: + explicit QAbstractItemDelegatePrivate(); + + bool editorEventFilter(QObject *object, QEvent *event); + bool tryFixup(QWidget *editor); + void _q_commitDataAndCloseEditor(QWidget *editor); +}; + +QT_END_NAMESPACE + +#endif // QT_NO_ITEMVIEWS + +#endif // QABSTRACTITEMDELEGATE_P_H diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 16de80476f..9d38a330c8 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -1531,6 +1531,7 @@ void QAbstractItemView::setIconSize(const QSize &size) return; d->iconSize = size; d->doDelayedItemsLayout(); + emit iconSizeChanged(size); } QSize QAbstractItemView::iconSize() const diff --git a/src/widgets/itemviews/qabstractitemview.h b/src/widgets/itemviews/qabstractitemview.h index f7cdcc8451..4162479194 100644 --- a/src/widgets/itemviews/qabstractitemview.h +++ b/src/widgets/itemviews/qabstractitemview.h @@ -68,7 +68,7 @@ class Q_WIDGETS_EXPORT QAbstractItemView : public QAbstractScrollArea Q_PROPERTY(bool alternatingRowColors READ alternatingRowColors WRITE setAlternatingRowColors) Q_PROPERTY(SelectionMode selectionMode READ selectionMode WRITE setSelectionMode) Q_PROPERTY(SelectionBehavior selectionBehavior READ selectionBehavior WRITE setSelectionBehavior) - Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize) + Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize NOTIFY iconSizeChanged) Q_PROPERTY(Qt::TextElideMode textElideMode READ textElideMode WRITE setTextElideMode) Q_PROPERTY(ScrollMode verticalScrollMode READ verticalScrollMode WRITE setVerticalScrollMode) Q_PROPERTY(ScrollMode horizontalScrollMode READ horizontalScrollMode WRITE setHorizontalScrollMode) @@ -255,6 +255,8 @@ Q_SIGNALS: void entered(const QModelIndex &index); void viewportEntered(); + void iconSizeChanged(const QSize &size); + protected: QAbstractItemView(QAbstractItemViewPrivate &, QWidget *parent = 0); diff --git a/src/widgets/itemviews/qitemdelegate.cpp b/src/widgets/itemviews/qitemdelegate.cpp index ef14ab8ed5..9303800e87 100644 --- a/src/widgets/itemviews/qitemdelegate.cpp +++ b/src/widgets/itemviews/qitemdelegate.cpp @@ -36,13 +36,7 @@ #ifndef QT_NO_ITEMVIEWS #include <qabstractitemmodel.h> #include <qapplication.h> -#include <qpa/qplatformintegration.h> -#include <qpa/qplatformdrag.h> -#include <private/qguiapplication_p.h> #include <qbrush.h> -#include <qlineedit.h> -#include <qtextedit.h> -#include <qplaintextedit.h> #include <qpainter.h> #include <qpalette.h> #include <qpoint.h> @@ -58,8 +52,7 @@ #include <qitemeditorfactory.h> #include <qmetaobject.h> #include <qtextlayout.h> -#include <private/qobject_p.h> -#include <private/qdnd_p.h> +#include <private/qabstractitemdelegate_p.h> #include <private/qtextengine_p.h> #include <qdebug.h> #include <qlocale.h> @@ -74,7 +67,7 @@ QT_BEGIN_NAMESPACE -class QItemDelegatePrivate : public QObjectPrivate +class QItemDelegatePrivate : public QAbstractItemDelegatePrivate { Q_DECLARE_PUBLIC(QItemDelegate) @@ -105,9 +98,6 @@ public: static QString valueToText(const QVariant &value, const QStyleOptionViewItem &option); - bool tryFixup(QWidget *editor); - void _q_commitDataAndCloseEditor(QWidget *editor); - QItemEditorFactory *f; bool clipPainting; @@ -129,13 +119,6 @@ public: } tmp; }; -void QItemDelegatePrivate::_q_commitDataAndCloseEditor(QWidget *editor) -{ - Q_Q(QItemDelegate); - emit q->commitData(editor); - emit q->closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); -} - QRect QItemDelegatePrivate::textLayoutBounds(const QStyleOptionViewItem &option) const { QRect rect = option.rect; @@ -379,24 +362,6 @@ QString QItemDelegatePrivate::valueToText(const QVariant &value, const QStyleOpt return text; } -bool QItemDelegatePrivate::tryFixup(QWidget *editor) -{ -#ifndef QT_NO_LINEEDIT - if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) { - if (!e->hasAcceptableInput()) { - if (const QValidator *validator = e->validator()) { - QString text = e->text(); - validator->fixup(text); - e->setText(text); - } - return e->hasAcceptableInput(); - } - } -#endif // QT_NO_LINEEDIT - - return true; -} - /*! Renders the delegate using the given \a painter and style \a option for the item specified by \a index. @@ -1166,75 +1131,7 @@ QRect QItemDelegate::textRectangle(QPainter * /*painter*/, const QRect &rect, bool QItemDelegate::eventFilter(QObject *object, QEvent *event) { Q_D(QItemDelegate); - - QWidget *editor = qobject_cast<QWidget*>(object); - if (!editor) - return false; - if (event->type() == QEvent::KeyPress) { - switch (static_cast<QKeyEvent *>(event)->key()) { - case Qt::Key_Tab: - if (d->tryFixup(editor)) { - emit commitData(editor); - emit closeEditor(editor, EditNextItem); - } - return true; - case Qt::Key_Backtab: - if (d->tryFixup(editor)) { - emit commitData(editor); - emit closeEditor(editor, EditPreviousItem); - } - return true; - case Qt::Key_Enter: - case Qt::Key_Return: -#ifndef QT_NO_TEXTEDIT - if (qobject_cast<QTextEdit *>(editor) || qobject_cast<QPlainTextEdit *>(editor)) - return false; // don't filter enter key events for QTextEdit - // We want the editor to be able to process the key press - // before committing the data (e.g. so it can do - // validation/fixup of the input). -#endif // QT_NO_TEXTEDIT - if (!d->tryFixup(editor)) - return true; - - QMetaObject::invokeMethod(this, "_q_commitDataAndCloseEditor", - Qt::QueuedConnection, Q_ARG(QWidget*, editor)); - return false; - case Qt::Key_Escape: - // don't commit data - emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); - return true; - default: - return false; - } - } else if (event->type() == QEvent::FocusOut || (event->type() == QEvent::Hide && editor->isWindow())) { - //the Hide event will take care of he editors that are in fact complete dialogs - if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { - QWidget *w = QApplication::focusWidget(); - while (w) { // don't worry about focus changes internally in the editor - if (w == editor) - return false; - w = w->parentWidget(); - } -#ifndef QT_NO_DRAGANDDROP - // The window may lose focus during an drag operation. - // i.e when dragging involves the taskbar on Windows. - QPlatformDrag *platformDrag = QGuiApplicationPrivate::instance()->platformIntegration()->drag(); - if (platformDrag && platformDrag->currentDrag()) { - return false; - } -#endif - if (d->tryFixup(editor)) - emit commitData(editor); - - emit closeEditor(editor, NoHint); - } - } else if (event->type() == QEvent::ShortcutOverride) { - if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { - event->accept(); - return true; - } - } - return false; + return d->editorEventFilter(object, event); } /*! diff --git a/src/widgets/itemviews/qitemdelegate.h b/src/widgets/itemviews/qitemdelegate.h index 55b33b69b2..70e55227f8 100644 --- a/src/widgets/itemviews/qitemdelegate.h +++ b/src/widgets/itemviews/qitemdelegate.h @@ -117,8 +117,6 @@ protected: private: Q_DECLARE_PRIVATE(QItemDelegate) Q_DISABLE_COPY(QItemDelegate) - - Q_PRIVATE_SLOT(d_func(), void _q_commitDataAndCloseEditor(QWidget*)) }; #endif // QT_NO_ITEMVIEWS diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 51561ac23b..aae75e5651 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -1783,9 +1783,24 @@ QStringList QListWidget::mimeTypes() const If the list of items is empty, 0 is returned instead of a serialized empty list. */ -QMimeData *QListWidget::mimeData(const QList<QListWidgetItem*>) const +QMimeData *QListWidget::mimeData(const QList<QListWidgetItem*> items) const { - return d_func()->listModel()->internalMimeData(); + Q_D(const QListWidget); + + QModelIndexList &cachedIndexes = d->listModel()->cachedIndexes; + + // if non empty, it's called from the model's own mimeData + if (cachedIndexes.isEmpty()) { + foreach (QListWidgetItem *item, items) + cachedIndexes << indexFromItem(item); + + QMimeData *result = d->listModel()->internalMimeData(); + + cachedIndexes.clear(); + return result; + } + + return d->listModel()->internalMimeData(); } #ifndef QT_NO_DRAGANDDROP diff --git a/src/widgets/itemviews/qlistwidget_p.h b/src/widgets/itemviews/qlistwidget_p.h index b019cd5eaf..1f2e9e8819 100644 --- a/src/widgets/itemviews/qlistwidget_p.h +++ b/src/widgets/itemviews/qlistwidget_p.h @@ -72,6 +72,8 @@ public: class Q_AUTOTEST_EXPORT QListModel : public QAbstractListModel { Q_OBJECT + friend class QListWidget; + public: QListModel(QListWidget *parent); ~QListModel(); diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp index fd4fb4440e..9d16b2abfc 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.cpp +++ b/src/widgets/itemviews/qstyleditemdelegate.cpp @@ -36,9 +36,6 @@ #ifndef QT_NO_ITEMVIEWS #include <qabstractitemmodel.h> #include <qapplication.h> -#include <qpa/qplatformintegration.h> -#include <qpa/qplatformdrag.h> -#include <private/qguiapplication_p.h> #include <qbrush.h> #include <qlineedit.h> #include <qtextedit.h> @@ -59,8 +56,7 @@ #include <private/qitemeditorfactory_p.h> #include <qmetaobject.h> #include <qtextlayout.h> -#include <private/qobject_p.h> -#include <private/qdnd_p.h> +#include <private/qabstractitemdelegate_p.h> #include <private/qtextengine_p.h> #include <private/qlayoutengine_p.h> #include <qdebug.h> @@ -72,7 +68,7 @@ QT_BEGIN_NAMESPACE -class QStyledItemDelegatePrivate : public QObjectPrivate +class QStyledItemDelegatePrivate : public QAbstractItemDelegatePrivate { Q_DECLARE_PUBLIC(QStyledItemDelegate) @@ -89,34 +85,9 @@ public: return factory ? factory : QItemEditorFactory::defaultFactory(); } - bool tryFixup(QWidget *editor); - void _q_commitDataAndCloseEditor(QWidget *editor) - { - Q_Q(QStyledItemDelegate); - emit q->commitData(editor); - emit q->closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); - } QItemEditorFactory *factory; }; -bool QStyledItemDelegatePrivate::tryFixup(QWidget *editor) -{ -#ifndef QT_NO_LINEEDIT - if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) { - if (!e->hasAcceptableInput()) { - if (const QValidator *validator = e->validator()) { - QString text = e->text(); - validator->fixup(text); - e->setText(text); - } - return e->hasAcceptableInput(); - } - } -#endif // QT_NO_LINEEDIT - - return true; -} - /*! \class QStyledItemDelegate @@ -637,75 +608,7 @@ void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory) bool QStyledItemDelegate::eventFilter(QObject *object, QEvent *event) { Q_D(QStyledItemDelegate); - - QWidget *editor = qobject_cast<QWidget*>(object); - if (!editor) - return false; - if (event->type() == QEvent::KeyPress) { - switch (static_cast<QKeyEvent *>(event)->key()) { - case Qt::Key_Tab: - if (d->tryFixup(editor)) { - emit commitData(editor); - emit closeEditor(editor, EditNextItem); - } - return true; - case Qt::Key_Backtab: - if (d->tryFixup(editor)) { - emit commitData(editor); - emit closeEditor(editor, EditPreviousItem); - } - return true; - case Qt::Key_Enter: - case Qt::Key_Return: -#ifndef QT_NO_TEXTEDIT - if (qobject_cast<QTextEdit *>(editor) || qobject_cast<QPlainTextEdit *>(editor)) - return false; // don't filter enter key events for QTextEdit - // We want the editor to be able to process the key press - // before committing the data (e.g. so it can do - // validation/fixup of the input). -#endif // QT_NO_TEXTEDIT - if (!d->tryFixup(editor)) - return true; - - QMetaObject::invokeMethod(this, "_q_commitDataAndCloseEditor", - Qt::QueuedConnection, Q_ARG(QWidget*, editor)); - return false; - case Qt::Key_Escape: - // don't commit data - emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); - return true; - default: - return false; - } - } else if (event->type() == QEvent::FocusOut || (event->type() == QEvent::Hide && editor->isWindow())) { - //the Hide event will take care of he editors that are in fact complete dialogs - if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { - QWidget *w = QApplication::focusWidget(); - while (w) { // don't worry about focus changes internally in the editor - if (w == editor) - return false; - w = w->parentWidget(); - } -#ifndef QT_NO_DRAGANDDROP - // The window may lose focus during an drag operation. - // i.e when dragging involves the taskbar on Windows. - QPlatformDrag *platformDrag = QGuiApplicationPrivate::instance()->platformIntegration()->drag(); - if (platformDrag && platformDrag->currentDrag()) { - return false; - } -#endif - if (d->tryFixup(editor)) - emit commitData(editor); - - emit closeEditor(editor, NoHint); - } - } else if (event->type() == QEvent::ShortcutOverride) { - if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { - event->accept(); - return true; - } - } - return false; + return d->editorEventFilter(object, event); } /*! diff --git a/src/widgets/itemviews/qstyleditemdelegate.h b/src/widgets/itemviews/qstyleditemdelegate.h index b523263bd9..e960e652e9 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.h +++ b/src/widgets/itemviews/qstyleditemdelegate.h @@ -92,8 +92,6 @@ protected: private: Q_DECLARE_PRIVATE(QStyledItemDelegate) Q_DISABLE_COPY(QStyledItemDelegate) - - Q_PRIVATE_SLOT(d_func(), void _q_commitDataAndCloseEditor(QWidget*)) }; #endif // QT_NO_ITEMVIEWS diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 7c24819c0e..eb239f8025 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -2553,9 +2553,24 @@ QStringList QTableWidget::mimeTypes() const If the list of items is empty, 0 is returned rather than a serialized empty list. */ -QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*>) const +QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*> items) const { - return d_func()->tableModel()->internalMimeData(); + Q_D(const QTableWidget); + + QModelIndexList &cachedIndexes = d->tableModel()->cachedIndexes; + + // if non empty, it's called from the model's own mimeData + if (cachedIndexes.isEmpty()) { + foreach (QTableWidgetItem *item, items) + cachedIndexes << indexFromItem(item); + + QMimeData *result = d->tableModel()->internalMimeData(); + + cachedIndexes.clear(); + return result; + } + + return d->tableModel()->internalMimeData(); } /*! diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 50b5a66eb5..92a8f5f305 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -82,6 +82,8 @@ public: class QTableModel : public QAbstractTableModel { Q_OBJECT + friend class QTableWidget; + public: enum ItemFlagsExtension { ItemIsHeaderItem = 128 diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 2c5f4b7c72..71bf92f321 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -3094,8 +3094,6 @@ void QTreeViewPrivate::expand(int item, bool emitSignal) void QTreeViewPrivate::insertViewItems(int pos, int count, const QTreeViewItem &viewItem) { - Q_Q(QTreeView); - Q_UNUSED(q) viewItems.insert(pos, count, viewItem); QTreeViewItem *items = viewItems.data(); for (int i = pos + count; i < viewItems.count(); i++) @@ -3105,8 +3103,6 @@ void QTreeViewPrivate::insertViewItems(int pos, int count, const QTreeViewItem & void QTreeViewPrivate::removeViewItems(int pos, int count) { - Q_Q(QTreeView); - Q_UNUSED(q) viewItems.remove(pos, count); QTreeViewItem *items = viewItems.data(); for (int i = pos; i < viewItems.count(); i++) diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h index bc444eb37f..72cb897353 100644 --- a/src/widgets/itemviews/qtreeview_p.h +++ b/src/widgets/itemviews/qtreeview_p.h @@ -210,6 +210,8 @@ public: QSet<QPersistentModelIndex> hiddenIndexes; inline bool isRowHidden(const QModelIndex &idx) const { + if (hiddenIndexes.isEmpty()) + return false; //We first check if the idx is a QPersistentModelIndex, because creating QPersistentModelIndex is slow return isPersistent(idx) && hiddenIndexes.contains(idx); } |