Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/widgets/itemviews/qabstractitemview.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||||||||
2 | ** | - | ||||||||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||||||||
5 | ** | - | ||||||||||||||||||
6 | ** This file is part of the QtWidgets module of the Qt Toolkit. | - | ||||||||||||||||||
7 | ** | - | ||||||||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||||||||
16 | ** | - | ||||||||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||||||||
24 | ** | - | ||||||||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||||||||
35 | ** | - | ||||||||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||||||||
37 | ** | - | ||||||||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||||||||
39 | - | |||||||||||||||||||
40 | #include "qabstractitemview.h" | - | ||||||||||||||||||
41 | - | |||||||||||||||||||
42 | #ifndef QT_NO_ITEMVIEWS | - | ||||||||||||||||||
43 | #include <qpointer.h> | - | ||||||||||||||||||
44 | #include <qapplication.h> | - | ||||||||||||||||||
45 | #include <qclipboard.h> | - | ||||||||||||||||||
46 | #include <qpainter.h> | - | ||||||||||||||||||
47 | #include <qstyle.h> | - | ||||||||||||||||||
48 | #include <qdrag.h> | - | ||||||||||||||||||
49 | #include <qevent.h> | - | ||||||||||||||||||
50 | #include <qscrollbar.h> | - | ||||||||||||||||||
51 | #include <qwhatsthis.h> | - | ||||||||||||||||||
52 | #include <qtooltip.h> | - | ||||||||||||||||||
53 | #include <qdatetime.h> | - | ||||||||||||||||||
54 | #include <qlineedit.h> | - | ||||||||||||||||||
55 | #include <qspinbox.h> | - | ||||||||||||||||||
56 | #include <qtreeview.h> | - | ||||||||||||||||||
57 | #include <qtableview.h> | - | ||||||||||||||||||
58 | #include <qheaderview.h> | - | ||||||||||||||||||
59 | #include <qstyleditemdelegate.h> | - | ||||||||||||||||||
60 | #include <private/qabstractitemview_p.h> | - | ||||||||||||||||||
61 | #include <private/qabstractitemmodel_p.h> | - | ||||||||||||||||||
62 | #include <private/qguiapplication_p.h> | - | ||||||||||||||||||
63 | #include <private/qscrollbar_p.h> | - | ||||||||||||||||||
64 | #ifndef QT_NO_ACCESSIBILITY | - | ||||||||||||||||||
65 | #include <qaccessible.h> | - | ||||||||||||||||||
66 | #endif | - | ||||||||||||||||||
67 | #ifndef QT_NO_GESTURES | - | ||||||||||||||||||
68 | # include <qscroller.h> | - | ||||||||||||||||||
69 | #endif | - | ||||||||||||||||||
70 | - | |||||||||||||||||||
71 | #include <algorithm> | - | ||||||||||||||||||
72 | - | |||||||||||||||||||
73 | QT_BEGIN_NAMESPACE | - | ||||||||||||||||||
74 | - | |||||||||||||||||||
75 | QAbstractItemViewPrivate::QAbstractItemViewPrivate() | - | ||||||||||||||||||
76 | : model(QAbstractItemModelPrivate::staticEmptyModel()), | - | ||||||||||||||||||
77 | itemDelegate(0), | - | ||||||||||||||||||
78 | selectionModel(0), | - | ||||||||||||||||||
79 | ctrlDragSelectionFlag(QItemSelectionModel::NoUpdate), | - | ||||||||||||||||||
80 | noSelectionOnMousePress(false), | - | ||||||||||||||||||
81 | selectionMode(QAbstractItemView::ExtendedSelection), | - | ||||||||||||||||||
82 | selectionBehavior(QAbstractItemView::SelectItems), | - | ||||||||||||||||||
83 | currentlyCommittingEditor(0), | - | ||||||||||||||||||
84 | pressedModifiers(Qt::NoModifier), | - | ||||||||||||||||||
85 | pressedPosition(QPoint(-1, -1)), | - | ||||||||||||||||||
86 | pressedAlreadySelected(false), | - | ||||||||||||||||||
87 | viewportEnteredNeeded(false), | - | ||||||||||||||||||
88 | state(QAbstractItemView::NoState), | - | ||||||||||||||||||
89 | stateBeforeAnimation(QAbstractItemView::NoState), | - | ||||||||||||||||||
90 | editTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed), | - | ||||||||||||||||||
91 | lastTrigger(QAbstractItemView::NoEditTriggers), | - | ||||||||||||||||||
92 | tabKeyNavigation(false), | - | ||||||||||||||||||
93 | #ifndef QT_NO_DRAGANDDROP | - | ||||||||||||||||||
94 | showDropIndicator(true), | - | ||||||||||||||||||
95 | dragEnabled(false), | - | ||||||||||||||||||
96 | dragDropMode(QAbstractItemView::NoDragDrop), | - | ||||||||||||||||||
97 | overwrite(false), | - | ||||||||||||||||||
98 | dropIndicatorPosition(QAbstractItemView::OnItem), | - | ||||||||||||||||||
99 | defaultDropAction(Qt::IgnoreAction), | - | ||||||||||||||||||
100 | #endif | - | ||||||||||||||||||
101 | autoScroll(true), | - | ||||||||||||||||||
102 | autoScrollMargin(16), | - | ||||||||||||||||||
103 | autoScrollCount(0), | - | ||||||||||||||||||
104 | shouldScrollToCurrentOnShow(false), | - | ||||||||||||||||||
105 | shouldClearStatusTip(false), | - | ||||||||||||||||||
106 | alternatingColors(false), | - | ||||||||||||||||||
107 | textElideMode(Qt::ElideRight), | - | ||||||||||||||||||
108 | verticalScrollMode(QAbstractItemView::ScrollPerItem), | - | ||||||||||||||||||
109 | horizontalScrollMode(QAbstractItemView::ScrollPerItem), | - | ||||||||||||||||||
110 | currentIndexSet(false), | - | ||||||||||||||||||
111 | wrapItemText(false), | - | ||||||||||||||||||
112 | delayedPendingLayout(true), | - | ||||||||||||||||||
113 | moveCursorUpdatedView(false), | - | ||||||||||||||||||
114 | verticalScrollModeSet(false), | - | ||||||||||||||||||
115 | horizontalScrollModeSet(false) | - | ||||||||||||||||||
116 | { | - | ||||||||||||||||||
117 | keyboardInputTime.invalidate(); | - | ||||||||||||||||||
118 | } never executed: end of block | 0 | ||||||||||||||||||
119 | - | |||||||||||||||||||
120 | QAbstractItemViewPrivate::~QAbstractItemViewPrivate() | - | ||||||||||||||||||
121 | { | - | ||||||||||||||||||
122 | } | - | ||||||||||||||||||
123 | - | |||||||||||||||||||
124 | void QAbstractItemViewPrivate::init() | - | ||||||||||||||||||
125 | { | - | ||||||||||||||||||
126 | Q_Q(QAbstractItemView); | - | ||||||||||||||||||
127 | q->setItemDelegate(new QStyledItemDelegate(q)); | - | ||||||||||||||||||
128 | - | |||||||||||||||||||
129 | vbar->setRange(0, 0); | - | ||||||||||||||||||
130 | hbar->setRange(0, 0); | - | ||||||||||||||||||
131 | - | |||||||||||||||||||
132 | QObject::connect(vbar, SIGNAL(actionTriggered(int)), | - | ||||||||||||||||||
133 | q, SLOT(verticalScrollbarAction(int))); | - | ||||||||||||||||||
134 | QObject::connect(hbar, SIGNAL(actionTriggered(int)), | - | ||||||||||||||||||
135 | q, SLOT(horizontalScrollbarAction(int))); | - | ||||||||||||||||||
136 | QObject::connect(vbar, SIGNAL(valueChanged(int)), | - | ||||||||||||||||||
137 | q, SLOT(verticalScrollbarValueChanged(int))); | - | ||||||||||||||||||
138 | QObject::connect(hbar, SIGNAL(valueChanged(int)), | - | ||||||||||||||||||
139 | q, SLOT(horizontalScrollbarValueChanged(int))); | - | ||||||||||||||||||
140 | - | |||||||||||||||||||
141 | viewport->setBackgroundRole(QPalette::Base); | - | ||||||||||||||||||
142 | - | |||||||||||||||||||
143 | q->setAttribute(Qt::WA_InputMethodEnabled); | - | ||||||||||||||||||
144 | - | |||||||||||||||||||
145 | verticalScrollMode = static_cast<QAbstractItemView::ScrollMode>(q->style()->styleHint(QStyle::SH_ItemView_ScrollMode, 0, q, 0)); | - | ||||||||||||||||||
146 | horizontalScrollMode = static_cast<QAbstractItemView::ScrollMode>(q->style()->styleHint(QStyle::SH_ItemView_ScrollMode, 0, q, 0)); | - | ||||||||||||||||||
147 | } never executed: end of block | 0 | ||||||||||||||||||
148 | - | |||||||||||||||||||
149 | void QAbstractItemViewPrivate::setHoverIndex(const QPersistentModelIndex &index) | - | ||||||||||||||||||
150 | { | - | ||||||||||||||||||
151 | Q_Q(QAbstractItemView); | - | ||||||||||||||||||
152 | if (hover == index)
| 0 | ||||||||||||||||||
153 | return; never executed: return; | 0 | ||||||||||||||||||
154 | - | |||||||||||||||||||
155 | if (selectionBehavior != QAbstractItemView::SelectRows) {
| 0 | ||||||||||||||||||
156 | q->update(hover); //update the old one | - | ||||||||||||||||||
157 | q->update(index); //update the new one | - | ||||||||||||||||||
158 | } else { never executed: end of block | 0 | ||||||||||||||||||
159 | QRect oldHoverRect = q->visualRect(hover); | - | ||||||||||||||||||
160 | QRect newHoverRect = q->visualRect(index); | - | ||||||||||||||||||
161 | viewport->update(QRect(0, newHoverRect.y(), viewport->width(), newHoverRect.height())); | - | ||||||||||||||||||
162 | viewport->update(QRect(0, oldHoverRect.y(), viewport->width(), oldHoverRect.height())); | - | ||||||||||||||||||
163 | } never executed: end of block | 0 | ||||||||||||||||||
164 | hover = index; | - | ||||||||||||||||||
165 | } never executed: end of block | 0 | ||||||||||||||||||
166 | - | |||||||||||||||||||
167 | void QAbstractItemViewPrivate::checkMouseMove(const QPersistentModelIndex &index) | - | ||||||||||||||||||
168 | { | - | ||||||||||||||||||
169 | //we take a persistent model index because the model might change by emitting signals | - | ||||||||||||||||||
170 | Q_Q(QAbstractItemView); | - | ||||||||||||||||||
171 | setHoverIndex(index); | - | ||||||||||||||||||
172 | if (viewportEnteredNeeded || enteredIndex != index) {
| 0 | ||||||||||||||||||
173 | viewportEnteredNeeded = false; | - | ||||||||||||||||||
174 | - | |||||||||||||||||||
175 | if (index.isValid()) {
| 0 | ||||||||||||||||||
176 | emit q->entered(index); | - | ||||||||||||||||||
177 | #ifndef QT_NO_STATUSTIP | - | ||||||||||||||||||
178 | QString statustip = model->data(index, Qt::StatusTipRole).toString(); | - | ||||||||||||||||||
179 | if (parent && (shouldClearStatusTip || !statustip.isEmpty())) {
| 0 | ||||||||||||||||||
180 | QStatusTipEvent tip(statustip); | - | ||||||||||||||||||
181 | QApplication::sendEvent(parent, &tip); | - | ||||||||||||||||||
182 | shouldClearStatusTip = !statustip.isEmpty(); | - | ||||||||||||||||||
183 | } never executed: end of block | 0 | ||||||||||||||||||
184 | #endif | - | ||||||||||||||||||
185 | } else { never executed: end of block | 0 | ||||||||||||||||||
186 | #ifndef QT_NO_STATUSTIP | - | ||||||||||||||||||
187 | if (parent && shouldClearStatusTip) {
| 0 | ||||||||||||||||||
188 | QString emptyString; | - | ||||||||||||||||||
189 | QStatusTipEvent tip( emptyString ); | - | ||||||||||||||||||
190 | QApplication::sendEvent(parent, &tip); | - | ||||||||||||||||||
191 | } never executed: end of block | 0 | ||||||||||||||||||
192 | #endif | - | ||||||||||||||||||
193 | emit q->viewportEntered(); | - | ||||||||||||||||||
194 | } never executed: end of block | 0 | ||||||||||||||||||
195 | enteredIndex = index; | - | ||||||||||||||||||
196 | } never executed: end of block | 0 | ||||||||||||||||||
197 | } never executed: end of block | 0 | ||||||||||||||||||
198 | - | |||||||||||||||||||
199 | #ifndef QT_NO_GESTURES | - | ||||||||||||||||||
200 | - | |||||||||||||||||||
201 | // stores and restores the selection and current item when flicking | - | ||||||||||||||||||
202 | void QAbstractItemViewPrivate::_q_scrollerStateChanged() | - | ||||||||||||||||||
203 | { | - | ||||||||||||||||||
204 | Q_Q(QAbstractItemView); | - | ||||||||||||||||||
205 | - | |||||||||||||||||||
206 | if (QScroller *scroller = QScroller::scroller(viewport)) {
| 0 | ||||||||||||||||||
207 | switch (scroller->state()) { | - | ||||||||||||||||||
208 | case QScroller::Pressed: never executed: case QScroller::Pressed: | 0 | ||||||||||||||||||
209 | // store the current selection in case we start scrolling | - | ||||||||||||||||||
210 | if (q->selectionModel()) {
| 0 | ||||||||||||||||||
211 | oldSelection = q->selectionModel()->selection(); | - | ||||||||||||||||||
212 | oldCurrent = q->selectionModel()->currentIndex(); | - | ||||||||||||||||||
213 | } never executed: end of block | 0 | ||||||||||||||||||
214 | break; never executed: break; | 0 | ||||||||||||||||||
215 | - | |||||||||||||||||||
216 | case QScroller::Dragging: never executed: case QScroller::Dragging: | 0 | ||||||||||||||||||
217 | // restore the old selection if we really start scrolling | - | ||||||||||||||||||
218 | if (q->selectionModel()) {
| 0 | ||||||||||||||||||
219 | q->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect); | - | ||||||||||||||||||
220 | q->selectionModel()->setCurrentIndex(oldCurrent, QItemSelectionModel::NoUpdate); | - | ||||||||||||||||||
221 | } never executed: end of block | 0 | ||||||||||||||||||
222 | // fall through | - | ||||||||||||||||||
223 | - | |||||||||||||||||||
224 | default: code before this statement never executed: default: never executed: default: | 0 | ||||||||||||||||||
225 | oldSelection = QItemSelection(); | - | ||||||||||||||||||
226 | oldCurrent = QModelIndex(); | - | ||||||||||||||||||
227 | break; never executed: break; | 0 | ||||||||||||||||||
228 | } | - | ||||||||||||||||||
229 | } | - | ||||||||||||||||||
230 | } never executed: end of block | 0 | ||||||||||||||||||
231 | - | |||||||||||||||||||
232 | #endif // QT_NO_GESTURES | - | ||||||||||||||||||
233 | - | |||||||||||||||||||
234 | /*! | - | ||||||||||||||||||
235 | \class QAbstractItemView | - | ||||||||||||||||||
236 | - | |||||||||||||||||||
237 | \brief The QAbstractItemView class provides the basic functionality for | - | ||||||||||||||||||
238 | item view classes. | - | ||||||||||||||||||
239 | - | |||||||||||||||||||
240 | \ingroup model-view | - | ||||||||||||||||||
241 | \inmodule QtWidgets | - | ||||||||||||||||||
242 | - | |||||||||||||||||||
243 | QAbstractItemView class is the base class for every standard view | - | ||||||||||||||||||
244 | that uses a QAbstractItemModel. QAbstractItemView is an abstract | - | ||||||||||||||||||
245 | class and cannot itself be instantiated. It provides a standard | - | ||||||||||||||||||
246 | interface for interoperating with models through the signals and | - | ||||||||||||||||||
247 | slots mechanism, enabling subclasses to be kept up-to-date with | - | ||||||||||||||||||
248 | changes to their models. This class provides standard support for | - | ||||||||||||||||||
249 | keyboard and mouse navigation, viewport scrolling, item editing, | - | ||||||||||||||||||
250 | and selections. The keyboard navigation implements this | - | ||||||||||||||||||
251 | functionality: | - | ||||||||||||||||||
252 | - | |||||||||||||||||||
253 | \table | - | ||||||||||||||||||
254 | \header | - | ||||||||||||||||||
255 | \li Keys | - | ||||||||||||||||||
256 | \li Functionality | - | ||||||||||||||||||
257 | \row | - | ||||||||||||||||||
258 | \li Arrow keys | - | ||||||||||||||||||
259 | \li Changes the current item and selects it. | - | ||||||||||||||||||
260 | \row | - | ||||||||||||||||||
261 | \li Ctrl+Arrow keys | - | ||||||||||||||||||
262 | \li Changes the current item but does not select it. | - | ||||||||||||||||||
263 | \row | - | ||||||||||||||||||
264 | \li Shift+Arrow keys | - | ||||||||||||||||||
265 | \li Changes the current item and selects it. The previously | - | ||||||||||||||||||
266 | selected item(s) is not deselected. | - | ||||||||||||||||||
267 | \row | - | ||||||||||||||||||
268 | \li Ctr+Space | - | ||||||||||||||||||
269 | \li Toggles selection of the current item. | - | ||||||||||||||||||
270 | \row | - | ||||||||||||||||||
271 | \li Tab/Backtab | - | ||||||||||||||||||
272 | \li Changes the current item to the next/previous item. | - | ||||||||||||||||||
273 | \row | - | ||||||||||||||||||
274 | \li Home/End | - | ||||||||||||||||||
275 | \li Selects the first/last item in the model. | - | ||||||||||||||||||
276 | \row | - | ||||||||||||||||||
277 | \li Page up/Page down | - | ||||||||||||||||||
278 | \li Scrolls the rows shown up/down by the number of | - | ||||||||||||||||||
279 | visible rows in the view. | - | ||||||||||||||||||
280 | \row | - | ||||||||||||||||||
281 | \li Ctrl+A | - | ||||||||||||||||||
282 | \li Selects all items in the model. | - | ||||||||||||||||||
283 | \endtable | - | ||||||||||||||||||
284 | - | |||||||||||||||||||
285 | Note that the above table assumes that the | - | ||||||||||||||||||
286 | \l{selectionMode}{selection mode} allows the operations. For | - | ||||||||||||||||||
287 | instance, you cannot select items if the selection mode is | - | ||||||||||||||||||
288 | QAbstractItemView::NoSelection. | - | ||||||||||||||||||
289 | - | |||||||||||||||||||
290 | The QAbstractItemView class is one of the \l{Model/View Classes} | - | ||||||||||||||||||
291 | and is part of Qt's \l{Model/View Programming}{model/view framework}. | - | ||||||||||||||||||
292 | - | |||||||||||||||||||
293 | The view classes that inherit QAbstractItemView only need | - | ||||||||||||||||||
294 | to implement their own view-specific functionality, such as | - | ||||||||||||||||||
295 | drawing items, returning the geometry of items, finding items, | - | ||||||||||||||||||
296 | etc. | - | ||||||||||||||||||
297 | - | |||||||||||||||||||
298 | QAbstractItemView provides common slots such as edit() and | - | ||||||||||||||||||
299 | setCurrentIndex(). Many protected slots are also provided, including | - | ||||||||||||||||||
300 | dataChanged(), rowsInserted(), rowsAboutToBeRemoved(), selectionChanged(), | - | ||||||||||||||||||
301 | and currentChanged(). | - | ||||||||||||||||||
302 | - | |||||||||||||||||||
303 | The root item is returned by rootIndex(), and the current item by | - | ||||||||||||||||||
304 | currentIndex(). To make sure that an item is visible use | - | ||||||||||||||||||
305 | scrollTo(). | - | ||||||||||||||||||
306 | - | |||||||||||||||||||
307 | Some of QAbstractItemView's functions are concerned with | - | ||||||||||||||||||
308 | scrolling, for example setHorizontalScrollMode() and | - | ||||||||||||||||||
309 | setVerticalScrollMode(). To set the range of the scroll bars, you | - | ||||||||||||||||||
310 | can, for example, reimplement the view's resizeEvent() function: | - | ||||||||||||||||||
311 | - | |||||||||||||||||||
312 | \snippet code/src_gui_itemviews_qabstractitemview.cpp 0 | - | ||||||||||||||||||
313 | - | |||||||||||||||||||
314 | Note that the range is not updated until the widget is shown. | - | ||||||||||||||||||
315 | - | |||||||||||||||||||
316 | Several other functions are concerned with selection control; for | - | ||||||||||||||||||
317 | example setSelectionMode(), and setSelectionBehavior(). This class | - | ||||||||||||||||||
318 | provides a default selection model to work with | - | ||||||||||||||||||
319 | (selectionModel()), but this can be replaced by using | - | ||||||||||||||||||
320 | setSelectionModel() with an instance of QItemSelectionModel. | - | ||||||||||||||||||
321 | - | |||||||||||||||||||
322 | For complete control over the display and editing of items you can | - | ||||||||||||||||||
323 | specify a delegate with setItemDelegate(). | - | ||||||||||||||||||
324 | - | |||||||||||||||||||
325 | QAbstractItemView provides a lot of protected functions. Some are | - | ||||||||||||||||||
326 | concerned with editing, for example, edit(), and commitData(), | - | ||||||||||||||||||
327 | whilst others are keyboard and mouse event handlers. | - | ||||||||||||||||||
328 | - | |||||||||||||||||||
329 | \note If you inherit QAbstractItemView and intend to update the contents | - | ||||||||||||||||||
330 | of the viewport, you should use viewport->update() instead of | - | ||||||||||||||||||
331 | \l{QWidget::update()}{update()} as all painting operations take place on the | - | ||||||||||||||||||
332 | viewport. | - | ||||||||||||||||||
333 | - | |||||||||||||||||||
334 | \sa {View Classes}, {Model/View Programming}, QAbstractItemModel, {Chart Example} | - | ||||||||||||||||||
335 | */ | - | ||||||||||||||||||
336 | - | |||||||||||||||||||
337 | /*! | - | ||||||||||||||||||
338 | \enum QAbstractItemView::SelectionMode | - | ||||||||||||||||||
339 | - | |||||||||||||||||||
340 | This enum indicates how the view responds to user selections: | - | ||||||||||||||||||
341 | - | |||||||||||||||||||
342 | \value SingleSelection When the user selects an item, any already-selected | - | ||||||||||||||||||
343 | item becomes unselected, and the user cannot unselect the selected item by | - | ||||||||||||||||||
344 | clicking on it. | - | ||||||||||||||||||
345 | - | |||||||||||||||||||
346 | \value ContiguousSelection When the user selects an item in the usual way, | - | ||||||||||||||||||
347 | the selection is cleared and the new item selected. However, if the user | - | ||||||||||||||||||
348 | presses the Shift key while clicking on an item, all items between the | - | ||||||||||||||||||
349 | current item and the clicked item are selected or unselected, depending on | - | ||||||||||||||||||
350 | the state of the clicked item. | - | ||||||||||||||||||
351 | - | |||||||||||||||||||
352 | \value ExtendedSelection When the user selects an item in the usual way, | - | ||||||||||||||||||
353 | the selection is cleared and the new item selected. However, if the user | - | ||||||||||||||||||
354 | presses the Ctrl key when clicking on an item, the clicked item gets | - | ||||||||||||||||||
355 | toggled and all other items are left untouched. If the user presses the | - | ||||||||||||||||||
356 | Shift key while clicking on an item, all items between the current item | - | ||||||||||||||||||
357 | and the clicked item are selected or unselected, depending on the state of | - | ||||||||||||||||||
358 | the clicked item. Multiple items can be selected by dragging the mouse over | - | ||||||||||||||||||
359 | them. | - | ||||||||||||||||||
360 | - | |||||||||||||||||||
361 | \value MultiSelection When the user selects an item in the usual way, the | - | ||||||||||||||||||
362 | selection status of that item is toggled and the other items are left | - | ||||||||||||||||||
363 | alone. Multiple items can be toggled by dragging the mouse over them. | - | ||||||||||||||||||
364 | - | |||||||||||||||||||
365 | \value NoSelection Items cannot be selected. | - | ||||||||||||||||||
366 | - | |||||||||||||||||||
367 | The most commonly used modes are SingleSelection and ExtendedSelection. | - | ||||||||||||||||||
368 | */ | - | ||||||||||||||||||
369 | - | |||||||||||||||||||
370 | /*! | - | ||||||||||||||||||
371 | \enum QAbstractItemView::SelectionBehavior | - | ||||||||||||||||||
372 | - | |||||||||||||||||||
373 | \value SelectItems Selecting single items. | - | ||||||||||||||||||
374 | \value SelectRows Selecting only rows. | - | ||||||||||||||||||
375 | \value SelectColumns Selecting only columns. | - | ||||||||||||||||||
376 | */ | - | ||||||||||||||||||
377 | - | |||||||||||||||||||
378 | /*! | - | ||||||||||||||||||
379 | \enum QAbstractItemView::ScrollHint | - | ||||||||||||||||||
380 | - | |||||||||||||||||||
381 | \value EnsureVisible Scroll to ensure that the item is visible. | - | ||||||||||||||||||
382 | \value PositionAtTop Scroll to position the item at the top of the | - | ||||||||||||||||||
383 | viewport. | - | ||||||||||||||||||
384 | \value PositionAtBottom Scroll to position the item at the bottom of the | - | ||||||||||||||||||
385 | viewport. | - | ||||||||||||||||||
386 | \value PositionAtCenter Scroll to position the item at the center of the | - | ||||||||||||||||||
387 | viewport. | - | ||||||||||||||||||
388 | */ | - | ||||||||||||||||||
389 | - | |||||||||||||||||||
390 | - | |||||||||||||||||||
391 | /*! | - | ||||||||||||||||||
392 | \enum QAbstractItemView::EditTrigger | - | ||||||||||||||||||
393 | - | |||||||||||||||||||
394 | This enum describes actions which will initiate item editing. | - | ||||||||||||||||||
395 | - | |||||||||||||||||||
396 | \value NoEditTriggers No editing possible. | - | ||||||||||||||||||
397 | \value CurrentChanged Editing start whenever current item changes. | - | ||||||||||||||||||
398 | \value DoubleClicked Editing starts when an item is double clicked. | - | ||||||||||||||||||
399 | \value SelectedClicked Editing starts when clicking on an already selected | - | ||||||||||||||||||
400 | item. | - | ||||||||||||||||||
401 | \value EditKeyPressed Editing starts when the platform edit key has been | - | ||||||||||||||||||
402 | pressed over an item. | - | ||||||||||||||||||
403 | \value AnyKeyPressed Editing starts when any key is pressed over an item. | - | ||||||||||||||||||
404 | \value AllEditTriggers Editing starts for all above actions. | - | ||||||||||||||||||
405 | */ | - | ||||||||||||||||||
406 | - | |||||||||||||||||||
407 | /*! | - | ||||||||||||||||||
408 | \enum QAbstractItemView::CursorAction | - | ||||||||||||||||||
409 | - | |||||||||||||||||||
410 | This enum describes the different ways to navigate between items, | - | ||||||||||||||||||
411 | \sa moveCursor() | - | ||||||||||||||||||
412 | - | |||||||||||||||||||
413 | \value MoveUp Move to the item above the current item. | - | ||||||||||||||||||
414 | \value MoveDown Move to the item below the current item. | - | ||||||||||||||||||
415 | \value MoveLeft Move to the item left of the current item. | - | ||||||||||||||||||
416 | \value MoveRight Move to the item right of the current item. | - | ||||||||||||||||||
417 | \value MoveHome Move to the top-left corner item. | - | ||||||||||||||||||
418 | \value MoveEnd Move to the bottom-right corner item. | - | ||||||||||||||||||
419 | \value MovePageUp Move one page up above the current item. | - | ||||||||||||||||||
420 | \value MovePageDown Move one page down below the current item. | - | ||||||||||||||||||
421 | \value MoveNext Move to the item after the current item. | - | ||||||||||||||||||
422 | \value MovePrevious Move to the item before the current item. | - | ||||||||||||||||||
423 | */ | - | ||||||||||||||||||
424 | - | |||||||||||||||||||
425 | /*! | - | ||||||||||||||||||
426 | \enum QAbstractItemView::State | - | ||||||||||||||||||
427 | - | |||||||||||||||||||
428 | Describes the different states the view can be in. This is usually | - | ||||||||||||||||||
429 | only interesting when reimplementing your own view. | - | ||||||||||||||||||
430 | - | |||||||||||||||||||
431 | \value NoState The is the default state. | - | ||||||||||||||||||
432 | \value DraggingState The user is dragging items. | - | ||||||||||||||||||
433 | \value DragSelectingState The user is selecting items. | - | ||||||||||||||||||
434 | \value EditingState The user is editing an item in a widget editor. | - | ||||||||||||||||||
435 | \value ExpandingState The user is opening a branch of items. | - | ||||||||||||||||||
436 | \value CollapsingState The user is closing a branch of items. | - | ||||||||||||||||||
437 | \value AnimatingState The item view is performing an animation. | - | ||||||||||||||||||
438 | */ | - | ||||||||||||||||||
439 | - | |||||||||||||||||||
440 | /*! | - | ||||||||||||||||||
441 | \since 4.2 | - | ||||||||||||||||||
442 | \enum QAbstractItemView::ScrollMode | - | ||||||||||||||||||
443 | - | |||||||||||||||||||
444 | Describes how the scrollbar should behave. When setting the scroll mode | - | ||||||||||||||||||
445 | to ScrollPerPixel the single step size will adjust automatically unless | - | ||||||||||||||||||
446 | it was set explicitly using \l{QAbstractSlider::}{setSingleStep()}. | - | ||||||||||||||||||
447 | The automatic adjustment can be restored by setting the single step size to -1. | - | ||||||||||||||||||
448 | - | |||||||||||||||||||
449 | \value ScrollPerItem The view will scroll the contents one item at a time. | - | ||||||||||||||||||
450 | \value ScrollPerPixel The view will scroll the contents one pixel at a time. | - | ||||||||||||||||||
451 | */ | - | ||||||||||||||||||
452 | - | |||||||||||||||||||
453 | /*! | - | ||||||||||||||||||
454 | \fn QRect QAbstractItemView::visualRect(const QModelIndex &index) const = 0 | - | ||||||||||||||||||
455 | Returns the rectangle on the viewport occupied by the item at \a index. | - | ||||||||||||||||||
456 | - | |||||||||||||||||||
457 | If your item is displayed in several areas then visualRect should return | - | ||||||||||||||||||
458 | the primary area that contains index and not the complete area that index | - | ||||||||||||||||||
459 | might encompasses, touch or cause drawing. | - | ||||||||||||||||||
460 | - | |||||||||||||||||||
461 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
462 | - | |||||||||||||||||||
463 | \sa indexAt(), visualRegionForSelection() | - | ||||||||||||||||||
464 | */ | - | ||||||||||||||||||
465 | - | |||||||||||||||||||
466 | /*! | - | ||||||||||||||||||
467 | \fn void QAbstractItemView::scrollTo(const QModelIndex &index, ScrollHint hint) = 0 | - | ||||||||||||||||||
468 | - | |||||||||||||||||||
469 | Scrolls the view if necessary to ensure that the item at \a index | - | ||||||||||||||||||
470 | is visible. The view will try to position the item according to the given \a hint. | - | ||||||||||||||||||
471 | - | |||||||||||||||||||
472 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
473 | */ | - | ||||||||||||||||||
474 | - | |||||||||||||||||||
475 | /*! | - | ||||||||||||||||||
476 | \fn QModelIndex QAbstractItemView::indexAt(const QPoint &point) const = 0 | - | ||||||||||||||||||
477 | - | |||||||||||||||||||
478 | Returns the model index of the item at the viewport coordinates \a point. | - | ||||||||||||||||||
479 | - | |||||||||||||||||||
480 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
481 | - | |||||||||||||||||||
482 | \sa visualRect() | - | ||||||||||||||||||
483 | */ | - | ||||||||||||||||||
484 | - | |||||||||||||||||||
485 | /*! | - | ||||||||||||||||||
486 | \fn void QAbstractItemView::activated(const QModelIndex &index) | - | ||||||||||||||||||
487 | - | |||||||||||||||||||
488 | This signal is emitted when the item specified by \a index is | - | ||||||||||||||||||
489 | activated by the user. How to activate items depends on the | - | ||||||||||||||||||
490 | platform; e.g., by single- or double-clicking the item, or by | - | ||||||||||||||||||
491 | pressing the Return or Enter key when the item is current. | - | ||||||||||||||||||
492 | - | |||||||||||||||||||
493 | \sa clicked(), doubleClicked(), entered(), pressed() | - | ||||||||||||||||||
494 | */ | - | ||||||||||||||||||
495 | - | |||||||||||||||||||
496 | /*! | - | ||||||||||||||||||
497 | \fn void QAbstractItemView::entered(const QModelIndex &index) | - | ||||||||||||||||||
498 | - | |||||||||||||||||||
499 | This signal is emitted when the mouse cursor enters the item | - | ||||||||||||||||||
500 | specified by \a index. | - | ||||||||||||||||||
501 | Mouse tracking needs to be enabled for this feature to work. | - | ||||||||||||||||||
502 | - | |||||||||||||||||||
503 | \sa viewportEntered(), activated(), clicked(), doubleClicked(), pressed() | - | ||||||||||||||||||
504 | */ | - | ||||||||||||||||||
505 | - | |||||||||||||||||||
506 | /*! | - | ||||||||||||||||||
507 | \fn void QAbstractItemView::viewportEntered() | - | ||||||||||||||||||
508 | - | |||||||||||||||||||
509 | This signal is emitted when the mouse cursor enters the viewport. | - | ||||||||||||||||||
510 | Mouse tracking needs to be enabled for this feature to work. | - | ||||||||||||||||||
511 | - | |||||||||||||||||||
512 | \sa entered() | - | ||||||||||||||||||
513 | */ | - | ||||||||||||||||||
514 | - | |||||||||||||||||||
515 | /*! | - | ||||||||||||||||||
516 | \fn void QAbstractItemView::pressed(const QModelIndex &index) | - | ||||||||||||||||||
517 | - | |||||||||||||||||||
518 | This signal is emitted when a mouse button is pressed. The item | - | ||||||||||||||||||
519 | the mouse was pressed on is specified by \a index. The signal is | - | ||||||||||||||||||
520 | only emitted when the index is valid. | - | ||||||||||||||||||
521 | - | |||||||||||||||||||
522 | Use the QApplication::mouseButtons() function to get the state | - | ||||||||||||||||||
523 | of the mouse buttons. | - | ||||||||||||||||||
524 | - | |||||||||||||||||||
525 | \sa activated(), clicked(), doubleClicked(), entered() | - | ||||||||||||||||||
526 | */ | - | ||||||||||||||||||
527 | - | |||||||||||||||||||
528 | /*! | - | ||||||||||||||||||
529 | \fn void QAbstractItemView::clicked(const QModelIndex &index) | - | ||||||||||||||||||
530 | - | |||||||||||||||||||
531 | This signal is emitted when a mouse button is left-clicked. The item | - | ||||||||||||||||||
532 | the mouse was clicked on is specified by \a index. The signal is | - | ||||||||||||||||||
533 | only emitted when the index is valid. | - | ||||||||||||||||||
534 | - | |||||||||||||||||||
535 | \sa activated(), doubleClicked(), entered(), pressed() | - | ||||||||||||||||||
536 | */ | - | ||||||||||||||||||
537 | - | |||||||||||||||||||
538 | /*! | - | ||||||||||||||||||
539 | \fn void QAbstractItemView::doubleClicked(const QModelIndex &index) | - | ||||||||||||||||||
540 | - | |||||||||||||||||||
541 | This signal is emitted when a mouse button is double-clicked. The | - | ||||||||||||||||||
542 | item the mouse was double-clicked on is specified by \a index. | - | ||||||||||||||||||
543 | The signal is only emitted when the index is valid. | - | ||||||||||||||||||
544 | - | |||||||||||||||||||
545 | \sa clicked(), activated() | - | ||||||||||||||||||
546 | */ | - | ||||||||||||||||||
547 | - | |||||||||||||||||||
548 | /*! | - | ||||||||||||||||||
549 | \fn QModelIndex QAbstractItemView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) = 0 | - | ||||||||||||||||||
550 | - | |||||||||||||||||||
551 | Returns a QModelIndex object pointing to the next object in the view, | - | ||||||||||||||||||
552 | based on the given \a cursorAction and keyboard modifiers specified | - | ||||||||||||||||||
553 | by \a modifiers. | - | ||||||||||||||||||
554 | - | |||||||||||||||||||
555 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
556 | */ | - | ||||||||||||||||||
557 | - | |||||||||||||||||||
558 | /*! | - | ||||||||||||||||||
559 | \fn int QAbstractItemView::horizontalOffset() const = 0 | - | ||||||||||||||||||
560 | - | |||||||||||||||||||
561 | Returns the horizontal offset of the view. | - | ||||||||||||||||||
562 | - | |||||||||||||||||||
563 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
564 | - | |||||||||||||||||||
565 | \sa verticalOffset() | - | ||||||||||||||||||
566 | */ | - | ||||||||||||||||||
567 | - | |||||||||||||||||||
568 | /*! | - | ||||||||||||||||||
569 | \fn int QAbstractItemView::verticalOffset() const = 0 | - | ||||||||||||||||||
570 | - | |||||||||||||||||||
571 | Returns the vertical offset of the view. | - | ||||||||||||||||||
572 | - | |||||||||||||||||||
573 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
574 | - | |||||||||||||||||||
575 | \sa horizontalOffset() | - | ||||||||||||||||||
576 | */ | - | ||||||||||||||||||
577 | - | |||||||||||||||||||
578 | /*! | - | ||||||||||||||||||
579 | \fn bool QAbstractItemView::isIndexHidden(const QModelIndex &index) const | - | ||||||||||||||||||
580 | - | |||||||||||||||||||
581 | Returns \c true if the item referred to by the given \a index is hidden in the view, | - | ||||||||||||||||||
582 | otherwise returns \c false. | - | ||||||||||||||||||
583 | - | |||||||||||||||||||
584 | Hiding is a view specific feature. For example in TableView a column can be marked | - | ||||||||||||||||||
585 | as hidden or a row in the TreeView. | - | ||||||||||||||||||
586 | - | |||||||||||||||||||
587 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
588 | */ | - | ||||||||||||||||||
589 | - | |||||||||||||||||||
590 | /*! | - | ||||||||||||||||||
591 | \fn void QAbstractItemView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags flags) | - | ||||||||||||||||||
592 | - | |||||||||||||||||||
593 | Applies the selection \a flags to the items in or touched by the | - | ||||||||||||||||||
594 | rectangle, \a rect. | - | ||||||||||||||||||
595 | - | |||||||||||||||||||
596 | When implementing your own itemview setSelection should call | - | ||||||||||||||||||
597 | selectionModel()->select(selection, flags) where selection | - | ||||||||||||||||||
598 | is either an empty QModelIndex or a QItemSelection that contains | - | ||||||||||||||||||
599 | all items that are contained in \a rect. | - | ||||||||||||||||||
600 | - | |||||||||||||||||||
601 | \sa selectionCommand(), selectedIndexes() | - | ||||||||||||||||||
602 | */ | - | ||||||||||||||||||
603 | - | |||||||||||||||||||
604 | /*! | - | ||||||||||||||||||
605 | \fn QRegion QAbstractItemView::visualRegionForSelection(const QItemSelection &selection) const = 0 | - | ||||||||||||||||||
606 | - | |||||||||||||||||||
607 | Returns the region from the viewport of the items in the given | - | ||||||||||||||||||
608 | \a selection. | - | ||||||||||||||||||
609 | - | |||||||||||||||||||
610 | In the base class this is a pure virtual function. | - | ||||||||||||||||||
611 | - | |||||||||||||||||||
612 | \sa visualRect(), selectedIndexes() | - | ||||||||||||||||||
613 | */ | - | ||||||||||||||||||
614 | - | |||||||||||||||||||
615 | /*! | - | ||||||||||||||||||
616 | Constructs an abstract item view with the given \a parent. | - | ||||||||||||||||||
617 | */ | - | ||||||||||||||||||
618 | QAbstractItemView::QAbstractItemView(QWidget *parent) | - | ||||||||||||||||||
619 | : QAbstractScrollArea(*(new QAbstractItemViewPrivate), parent) | - | ||||||||||||||||||
620 | { | - | ||||||||||||||||||
621 | d_func()->init(); | - | ||||||||||||||||||
622 | } never executed: end of block | 0 | ||||||||||||||||||
623 | - | |||||||||||||||||||
624 | /*! | - | ||||||||||||||||||
625 | \internal | - | ||||||||||||||||||
626 | */ | - | ||||||||||||||||||
627 | QAbstractItemView::QAbstractItemView(QAbstractItemViewPrivate &dd, QWidget *parent) | - | ||||||||||||||||||
628 | : QAbstractScrollArea(dd, parent) | - | ||||||||||||||||||
629 | { | - | ||||||||||||||||||
630 | d_func()->init(); | - | ||||||||||||||||||
631 | } never executed: end of block | 0 | ||||||||||||||||||
632 | - | |||||||||||||||||||
633 | /*! | - | ||||||||||||||||||
634 | Destroys the view. | - | ||||||||||||||||||
635 | */ | - | ||||||||||||||||||
636 | QAbstractItemView::~QAbstractItemView() | - | ||||||||||||||||||
637 | { | - | ||||||||||||||||||
638 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
639 | // stop these timers here before ~QObject | - | ||||||||||||||||||
640 | d->delayedReset.stop(); | - | ||||||||||||||||||
641 | d->updateTimer.stop(); | - | ||||||||||||||||||
642 | d->delayedEditing.stop(); | - | ||||||||||||||||||
643 | d->delayedAutoScroll.stop(); | - | ||||||||||||||||||
644 | d->autoScrollTimer.stop(); | - | ||||||||||||||||||
645 | d->delayedLayout.stop(); | - | ||||||||||||||||||
646 | d->fetchMoreTimer.stop(); | - | ||||||||||||||||||
647 | } never executed: end of block | 0 | ||||||||||||||||||
648 | - | |||||||||||||||||||
649 | /*! | - | ||||||||||||||||||
650 | Sets the \a model for the view to present. | - | ||||||||||||||||||
651 | - | |||||||||||||||||||
652 | This function will create and set a new selection model, replacing any | - | ||||||||||||||||||
653 | model that was previously set with setSelectionModel(). However, the old | - | ||||||||||||||||||
654 | selection model will not be deleted as it may be shared between several | - | ||||||||||||||||||
655 | views. We recommend that you delete the old selection model if it is no | - | ||||||||||||||||||
656 | longer required. This is done with the following code: | - | ||||||||||||||||||
657 | - | |||||||||||||||||||
658 | \snippet code/src_gui_itemviews_qabstractitemview.cpp 2 | - | ||||||||||||||||||
659 | - | |||||||||||||||||||
660 | If both the old model and the old selection model do not have parents, or | - | ||||||||||||||||||
661 | if their parents are long-lived objects, it may be preferable to call their | - | ||||||||||||||||||
662 | deleteLater() functions to explicitly delete them. | - | ||||||||||||||||||
663 | - | |||||||||||||||||||
664 | The view \e{does not} take ownership of the model unless it is the model's | - | ||||||||||||||||||
665 | parent object because the model may be shared between many different views. | - | ||||||||||||||||||
666 | - | |||||||||||||||||||
667 | \sa selectionModel(), setSelectionModel() | - | ||||||||||||||||||
668 | */ | - | ||||||||||||||||||
669 | void QAbstractItemView::setModel(QAbstractItemModel *model) | - | ||||||||||||||||||
670 | { | - | ||||||||||||||||||
671 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
672 | if (model == d->model)
| 0 | ||||||||||||||||||
673 | return; never executed: return; | 0 | ||||||||||||||||||
674 | if (d->model && d->model != QAbstractItemModelPrivate::staticEmptyModel()) {
| 0 | ||||||||||||||||||
675 | disconnect(d->model, SIGNAL(destroyed()), | - | ||||||||||||||||||
676 | this, SLOT(_q_modelDestroyed())); | - | ||||||||||||||||||
677 | disconnect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)), | - | ||||||||||||||||||
678 | this, SLOT(dataChanged(QModelIndex,QModelIndex,QVector<int>))); | - | ||||||||||||||||||
679 | disconnect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), | - | ||||||||||||||||||
680 | this, SLOT(_q_headerDataChanged())); | - | ||||||||||||||||||
681 | disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), | - | ||||||||||||||||||
682 | this, SLOT(rowsInserted(QModelIndex,int,int))); | - | ||||||||||||||||||
683 | disconnect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
684 | this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
685 | disconnect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
686 | this, SLOT(_q_rowsRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
687 | disconnect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), | - | ||||||||||||||||||
688 | this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int))); | - | ||||||||||||||||||
689 | disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), | - | ||||||||||||||||||
690 | this, SLOT(_q_rowsInserted(QModelIndex,int,int))); | - | ||||||||||||||||||
691 | disconnect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
692 | this, SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
693 | disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
694 | this, SLOT(_q_columnsRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
695 | disconnect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)), | - | ||||||||||||||||||
696 | this, SLOT(_q_columnsInserted(QModelIndex,int,int))); | - | ||||||||||||||||||
697 | disconnect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), | - | ||||||||||||||||||
698 | this, SLOT(_q_columnsMoved(QModelIndex,int,int,QModelIndex,int))); | - | ||||||||||||||||||
699 | - | |||||||||||||||||||
700 | disconnect(d->model, SIGNAL(modelReset()), this, SLOT(reset())); | - | ||||||||||||||||||
701 | disconnect(d->model, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged())); | - | ||||||||||||||||||
702 | } never executed: end of block | 0 | ||||||||||||||||||
703 | d->model = (model ? model : QAbstractItemModelPrivate::staticEmptyModel());
| 0 | ||||||||||||||||||
704 | - | |||||||||||||||||||
705 | // These asserts do basic sanity checking of the model | - | ||||||||||||||||||
706 | Q_ASSERT_X(d->model->index(0,0) == d->model->index(0,0), | - | ||||||||||||||||||
707 | "QAbstractItemView::setModel", | - | ||||||||||||||||||
708 | "A model should return the exact same index " | - | ||||||||||||||||||
709 | "(including its internal id/pointer) when asked for it twice in a row."); | - | ||||||||||||||||||
710 | Q_ASSERT_X(!d->model->index(0,0).parent().isValid(), | - | ||||||||||||||||||
711 | "QAbstractItemView::setModel", | - | ||||||||||||||||||
712 | "The parent of a top level index should be invalid"); | - | ||||||||||||||||||
713 | - | |||||||||||||||||||
714 | if (d->model != QAbstractItemModelPrivate::staticEmptyModel()) {
| 0 | ||||||||||||||||||
715 | connect(d->model, SIGNAL(destroyed()), | - | ||||||||||||||||||
716 | this, SLOT(_q_modelDestroyed())); | - | ||||||||||||||||||
717 | connect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)), | - | ||||||||||||||||||
718 | this, SLOT(dataChanged(QModelIndex,QModelIndex,QVector<int>))); | - | ||||||||||||||||||
719 | connect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), | - | ||||||||||||||||||
720 | this, SLOT(_q_headerDataChanged())); | - | ||||||||||||||||||
721 | connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), | - | ||||||||||||||||||
722 | this, SLOT(rowsInserted(QModelIndex,int,int))); | - | ||||||||||||||||||
723 | connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), | - | ||||||||||||||||||
724 | this, SLOT(_q_rowsInserted(QModelIndex,int,int))); | - | ||||||||||||||||||
725 | connect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
726 | this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
727 | connect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
728 | this, SLOT(_q_rowsRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
729 | connect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), | - | ||||||||||||||||||
730 | this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int))); | - | ||||||||||||||||||
731 | connect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
732 | this, SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
733 | connect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), | - | ||||||||||||||||||
734 | this, SLOT(_q_columnsRemoved(QModelIndex,int,int))); | - | ||||||||||||||||||
735 | connect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)), | - | ||||||||||||||||||
736 | this, SLOT(_q_columnsInserted(QModelIndex,int,int))); | - | ||||||||||||||||||
737 | connect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), | - | ||||||||||||||||||
738 | this, SLOT(_q_columnsMoved(QModelIndex,int,int,QModelIndex,int))); | - | ||||||||||||||||||
739 | - | |||||||||||||||||||
740 | connect(d->model, SIGNAL(modelReset()), this, SLOT(reset())); | - | ||||||||||||||||||
741 | connect(d->model, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged())); | - | ||||||||||||||||||
742 | } never executed: end of block | 0 | ||||||||||||||||||
743 | - | |||||||||||||||||||
744 | QItemSelectionModel *selection_model = new QItemSelectionModel(d->model, this); | - | ||||||||||||||||||
745 | connect(d->model, SIGNAL(destroyed()), selection_model, SLOT(deleteLater())); | - | ||||||||||||||||||
746 | setSelectionModel(selection_model); | - | ||||||||||||||||||
747 | - | |||||||||||||||||||
748 | reset(); // kill editors, set new root and do layout | - | ||||||||||||||||||
749 | } never executed: end of block | 0 | ||||||||||||||||||
750 | - | |||||||||||||||||||
751 | /*! | - | ||||||||||||||||||
752 | Returns the model that this view is presenting. | - | ||||||||||||||||||
753 | */ | - | ||||||||||||||||||
754 | QAbstractItemModel *QAbstractItemView::model() const | - | ||||||||||||||||||
755 | { | - | ||||||||||||||||||
756 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
757 | return (d->model == QAbstractItemModelPrivate::staticEmptyModel() ? 0 : d->model); never executed: return (d->model == QAbstractItemModelPrivate::staticEmptyModel() ? 0 : d->model); | 0 | ||||||||||||||||||
758 | } | - | ||||||||||||||||||
759 | - | |||||||||||||||||||
760 | /*! | - | ||||||||||||||||||
761 | Sets the current selection model to the given \a selectionModel. | - | ||||||||||||||||||
762 | - | |||||||||||||||||||
763 | Note that, if you call setModel() after this function, the given \a selectionModel | - | ||||||||||||||||||
764 | will be replaced by one created by the view. | - | ||||||||||||||||||
765 | - | |||||||||||||||||||
766 | \note It is up to the application to delete the old selection model if it is no | - | ||||||||||||||||||
767 | longer needed; i.e., if it is not being used by other views. This will happen | - | ||||||||||||||||||
768 | automatically when its parent object is deleted. However, if it does not have a | - | ||||||||||||||||||
769 | parent, or if the parent is a long-lived object, it may be preferable to call its | - | ||||||||||||||||||
770 | deleteLater() function to explicitly delete it. | - | ||||||||||||||||||
771 | - | |||||||||||||||||||
772 | \sa selectionModel(), setModel(), clearSelection() | - | ||||||||||||||||||
773 | */ | - | ||||||||||||||||||
774 | void QAbstractItemView::setSelectionModel(QItemSelectionModel *selectionModel) | - | ||||||||||||||||||
775 | { | - | ||||||||||||||||||
776 | // ### if the given model is null, we should use the original selection model | - | ||||||||||||||||||
777 | Q_ASSERT(selectionModel); | - | ||||||||||||||||||
778 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
779 | - | |||||||||||||||||||
780 | if (Q_UNLIKELY(selectionModel->model() != d->model)) {
| 0 | ||||||||||||||||||
781 | qWarning("QAbstractItemView::setSelectionModel() failed: " | - | ||||||||||||||||||
782 | "Trying to set a selection model, which works on " | - | ||||||||||||||||||
783 | "a different model than the view."); | - | ||||||||||||||||||
784 | return; never executed: return; | 0 | ||||||||||||||||||
785 | } | - | ||||||||||||||||||
786 | - | |||||||||||||||||||
787 | QItemSelection oldSelection; | - | ||||||||||||||||||
788 | QModelIndex oldCurrentIndex; | - | ||||||||||||||||||
789 | - | |||||||||||||||||||
790 | if (d->selectionModel) {
| 0 | ||||||||||||||||||
791 | if (d->selectionModel->model() == selectionModel->model()) {
| 0 | ||||||||||||||||||
792 | oldSelection = d->selectionModel->selection(); | - | ||||||||||||||||||
793 | oldCurrentIndex = d->selectionModel->currentIndex(); | - | ||||||||||||||||||
794 | } never executed: end of block | 0 | ||||||||||||||||||
795 | - | |||||||||||||||||||
796 | disconnect(d->selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), | - | ||||||||||||||||||
797 | this, SLOT(selectionChanged(QItemSelection,QItemSelection))); | - | ||||||||||||||||||
798 | disconnect(d->selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), | - | ||||||||||||||||||
799 | this, SLOT(currentChanged(QModelIndex,QModelIndex))); | - | ||||||||||||||||||
800 | } never executed: end of block | 0 | ||||||||||||||||||
801 | - | |||||||||||||||||||
802 | d->selectionModel = selectionModel; | - | ||||||||||||||||||
803 | - | |||||||||||||||||||
804 | if (d->selectionModel) {
| 0 | ||||||||||||||||||
805 | connect(d->selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), | - | ||||||||||||||||||
806 | this, SLOT(selectionChanged(QItemSelection,QItemSelection))); | - | ||||||||||||||||||
807 | connect(d->selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), | - | ||||||||||||||||||
808 | this, SLOT(currentChanged(QModelIndex,QModelIndex))); | - | ||||||||||||||||||
809 | - | |||||||||||||||||||
810 | selectionChanged(d->selectionModel->selection(), oldSelection); | - | ||||||||||||||||||
811 | currentChanged(d->selectionModel->currentIndex(), oldCurrentIndex); | - | ||||||||||||||||||
812 | } never executed: end of block | 0 | ||||||||||||||||||
813 | } never executed: end of block | 0 | ||||||||||||||||||
814 | - | |||||||||||||||||||
815 | /*! | - | ||||||||||||||||||
816 | Returns the current selection model. | - | ||||||||||||||||||
817 | - | |||||||||||||||||||
818 | \sa setSelectionModel(), selectedIndexes() | - | ||||||||||||||||||
819 | */ | - | ||||||||||||||||||
820 | QItemSelectionModel* QAbstractItemView::selectionModel() const | - | ||||||||||||||||||
821 | { | - | ||||||||||||||||||
822 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
823 | return d->selectionModel; never executed: return d->selectionModel; | 0 | ||||||||||||||||||
824 | } | - | ||||||||||||||||||
825 | - | |||||||||||||||||||
826 | /*! | - | ||||||||||||||||||
827 | Sets the item delegate for this view and its model to \a delegate. | - | ||||||||||||||||||
828 | This is useful if you want complete control over the editing and | - | ||||||||||||||||||
829 | display of items. | - | ||||||||||||||||||
830 | - | |||||||||||||||||||
831 | Any existing delegate will be removed, but not deleted. QAbstractItemView | - | ||||||||||||||||||
832 | does not take ownership of \a delegate. | - | ||||||||||||||||||
833 | - | |||||||||||||||||||
834 | \warning You should not share the same instance of a delegate between views. | - | ||||||||||||||||||
835 | Doing so can cause incorrect or unintuitive editing behavior since each | - | ||||||||||||||||||
836 | view connected to a given delegate may receive the \l{QAbstractItemDelegate::}{closeEditor()} | - | ||||||||||||||||||
837 | signal, and attempt to access, modify or close an editor that has already been closed. | - | ||||||||||||||||||
838 | - | |||||||||||||||||||
839 | \sa itemDelegate() | - | ||||||||||||||||||
840 | */ | - | ||||||||||||||||||
841 | void QAbstractItemView::setItemDelegate(QAbstractItemDelegate *delegate) | - | ||||||||||||||||||
842 | { | - | ||||||||||||||||||
843 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
844 | if (delegate == d->itemDelegate)
| 0 | ||||||||||||||||||
845 | return; never executed: return; | 0 | ||||||||||||||||||
846 | - | |||||||||||||||||||
847 | if (d->itemDelegate) {
| 0 | ||||||||||||||||||
848 | if (d->delegateRefCount(d->itemDelegate) == 1) {
| 0 | ||||||||||||||||||
849 | disconnect(d->itemDelegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), | - | ||||||||||||||||||
850 | this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); | - | ||||||||||||||||||
851 | disconnect(d->itemDelegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); | - | ||||||||||||||||||
852 | disconnect(d->itemDelegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(doItemsLayout())); | - | ||||||||||||||||||
853 | } never executed: end of block | 0 | ||||||||||||||||||
854 | } never executed: end of block | 0 | ||||||||||||||||||
855 | - | |||||||||||||||||||
856 | if (delegate) {
| 0 | ||||||||||||||||||
857 | if (d->delegateRefCount(delegate) == 0) {
| 0 | ||||||||||||||||||
858 | connect(delegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), | - | ||||||||||||||||||
859 | this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); | - | ||||||||||||||||||
860 | connect(delegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); | - | ||||||||||||||||||
861 | connect(delegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(doItemsLayout()), Qt::QueuedConnection); | - | ||||||||||||||||||
862 | } never executed: end of block | 0 | ||||||||||||||||||
863 | } never executed: end of block | 0 | ||||||||||||||||||
864 | d->itemDelegate = delegate; | - | ||||||||||||||||||
865 | viewport()->update(); | - | ||||||||||||||||||
866 | d->doDelayedItemsLayout(); | - | ||||||||||||||||||
867 | } never executed: end of block | 0 | ||||||||||||||||||
868 | - | |||||||||||||||||||
869 | /*! | - | ||||||||||||||||||
870 | Returns the item delegate used by this view and model. This is | - | ||||||||||||||||||
871 | either one set with setItemDelegate(), or the default one. | - | ||||||||||||||||||
872 | - | |||||||||||||||||||
873 | \sa setItemDelegate() | - | ||||||||||||||||||
874 | */ | - | ||||||||||||||||||
875 | QAbstractItemDelegate *QAbstractItemView::itemDelegate() const | - | ||||||||||||||||||
876 | { | - | ||||||||||||||||||
877 | return d_func()->itemDelegate; never executed: return d_func()->itemDelegate; | 0 | ||||||||||||||||||
878 | } | - | ||||||||||||||||||
879 | - | |||||||||||||||||||
880 | /*! | - | ||||||||||||||||||
881 | \reimp | - | ||||||||||||||||||
882 | */ | - | ||||||||||||||||||
883 | QVariant QAbstractItemView::inputMethodQuery(Qt::InputMethodQuery query) const | - | ||||||||||||||||||
884 | { | - | ||||||||||||||||||
885 | const QModelIndex current = currentIndex(); | - | ||||||||||||||||||
886 | if (!current.isValid() || query != Qt::ImCursorRectangle)
| 0 | ||||||||||||||||||
887 | return QAbstractScrollArea::inputMethodQuery(query); never executed: return QAbstractScrollArea::inputMethodQuery(query); | 0 | ||||||||||||||||||
888 | return visualRect(current); never executed: return visualRect(current); | 0 | ||||||||||||||||||
889 | } | - | ||||||||||||||||||
890 | - | |||||||||||||||||||
891 | /*! | - | ||||||||||||||||||
892 | \since 4.2 | - | ||||||||||||||||||
893 | - | |||||||||||||||||||
894 | Sets the given item \a delegate used by this view and model for the given | - | ||||||||||||||||||
895 | \a row. All items on \a row will be drawn and managed by \a delegate | - | ||||||||||||||||||
896 | instead of using the default delegate (i.e., itemDelegate()). | - | ||||||||||||||||||
897 | - | |||||||||||||||||||
898 | Any existing row delegate for \a row will be removed, but not | - | ||||||||||||||||||
899 | deleted. QAbstractItemView does not take ownership of \a delegate. | - | ||||||||||||||||||
900 | - | |||||||||||||||||||
901 | \note If a delegate has been assigned to both a row and a column, the row | - | ||||||||||||||||||
902 | delegate (i.e., this delegate) will take precedence and manage the | - | ||||||||||||||||||
903 | intersecting cell index. | - | ||||||||||||||||||
904 | - | |||||||||||||||||||
905 | \warning You should not share the same instance of a delegate between views. | - | ||||||||||||||||||
906 | Doing so can cause incorrect or unintuitive editing behavior since each | - | ||||||||||||||||||
907 | view connected to a given delegate may receive the \l{QAbstractItemDelegate::}{closeEditor()} | - | ||||||||||||||||||
908 | signal, and attempt to access, modify or close an editor that has already been closed. | - | ||||||||||||||||||
909 | - | |||||||||||||||||||
910 | \sa itemDelegateForRow(), setItemDelegateForColumn(), itemDelegate() | - | ||||||||||||||||||
911 | */ | - | ||||||||||||||||||
912 | void QAbstractItemView::setItemDelegateForRow(int row, QAbstractItemDelegate *delegate) | - | ||||||||||||||||||
913 | { | - | ||||||||||||||||||
914 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
915 | if (QAbstractItemDelegate *rowDelegate = d->rowDelegates.value(row, 0)) {
| 0 | ||||||||||||||||||
916 | if (d->delegateRefCount(rowDelegate) == 1) {
| 0 | ||||||||||||||||||
917 | disconnect(rowDelegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), | - | ||||||||||||||||||
918 | this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); | - | ||||||||||||||||||
919 | disconnect(rowDelegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); | - | ||||||||||||||||||
920 | disconnect(rowDelegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(doItemsLayout())); | - | ||||||||||||||||||
921 | } never executed: end of block | 0 | ||||||||||||||||||
922 | d->rowDelegates.remove(row); | - | ||||||||||||||||||
923 | } never executed: end of block | 0 | ||||||||||||||||||
924 | if (delegate) {
| 0 | ||||||||||||||||||
925 | if (d->delegateRefCount(delegate) == 0) {
| 0 | ||||||||||||||||||
926 | connect(delegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), | - | ||||||||||||||||||
927 | this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); | - | ||||||||||||||||||
928 | connect(delegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); | - | ||||||||||||||||||
929 | connect(delegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(doItemsLayout()), Qt::QueuedConnection); | - | ||||||||||||||||||
930 | } never executed: end of block | 0 | ||||||||||||||||||
931 | d->rowDelegates.insert(row, delegate); | - | ||||||||||||||||||
932 | } never executed: end of block | 0 | ||||||||||||||||||
933 | viewport()->update(); | - | ||||||||||||||||||
934 | d->doDelayedItemsLayout(); | - | ||||||||||||||||||
935 | } never executed: end of block | 0 | ||||||||||||||||||
936 | - | |||||||||||||||||||
937 | /*! | - | ||||||||||||||||||
938 | \since 4.2 | - | ||||||||||||||||||
939 | - | |||||||||||||||||||
940 | Returns the item delegate used by this view and model for the given \a row, | - | ||||||||||||||||||
941 | or 0 if no delegate has been assigned. You can call itemDelegate() to get a | - | ||||||||||||||||||
942 | pointer to the current delegate for a given index. | - | ||||||||||||||||||
943 | - | |||||||||||||||||||
944 | \sa setItemDelegateForRow(), itemDelegateForColumn(), setItemDelegate() | - | ||||||||||||||||||
945 | */ | - | ||||||||||||||||||
946 | QAbstractItemDelegate *QAbstractItemView::itemDelegateForRow(int row) const | - | ||||||||||||||||||
947 | { | - | ||||||||||||||||||
948 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
949 | return d->rowDelegates.value(row, 0); never executed: return d->rowDelegates.value(row, 0); | 0 | ||||||||||||||||||
950 | } | - | ||||||||||||||||||
951 | - | |||||||||||||||||||
952 | /*! | - | ||||||||||||||||||
953 | \since 4.2 | - | ||||||||||||||||||
954 | - | |||||||||||||||||||
955 | Sets the given item \a delegate used by this view and model for the given | - | ||||||||||||||||||
956 | \a column. All items on \a column will be drawn and managed by \a delegate | - | ||||||||||||||||||
957 | instead of using the default delegate (i.e., itemDelegate()). | - | ||||||||||||||||||
958 | - | |||||||||||||||||||
959 | Any existing column delegate for \a column will be removed, but not | - | ||||||||||||||||||
960 | deleted. QAbstractItemView does not take ownership of \a delegate. | - | ||||||||||||||||||
961 | - | |||||||||||||||||||
962 | \note If a delegate has been assigned to both a row and a column, the row | - | ||||||||||||||||||
963 | delegate will take precedence and manage the intersecting cell index. | - | ||||||||||||||||||
964 | - | |||||||||||||||||||
965 | \warning You should not share the same instance of a delegate between views. | - | ||||||||||||||||||
966 | Doing so can cause incorrect or unintuitive editing behavior since each | - | ||||||||||||||||||
967 | view connected to a given delegate may receive the \l{QAbstractItemDelegate::}{closeEditor()} | - | ||||||||||||||||||
968 | signal, and attempt to access, modify or close an editor that has already been closed. | - | ||||||||||||||||||
969 | - | |||||||||||||||||||
970 | \sa itemDelegateForColumn(), setItemDelegateForRow(), itemDelegate() | - | ||||||||||||||||||
971 | */ | - | ||||||||||||||||||
972 | void QAbstractItemView::setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate) | - | ||||||||||||||||||
973 | { | - | ||||||||||||||||||
974 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
975 | if (QAbstractItemDelegate *columnDelegate = d->columnDelegates.value(column, 0)) {
| 0 | ||||||||||||||||||
976 | if (d->delegateRefCount(columnDelegate) == 1) {
| 0 | ||||||||||||||||||
977 | disconnect(columnDelegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), | - | ||||||||||||||||||
978 | this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); | - | ||||||||||||||||||
979 | disconnect(columnDelegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); | - | ||||||||||||||||||
980 | disconnect(columnDelegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(doItemsLayout())); | - | ||||||||||||||||||
981 | } never executed: end of block | 0 | ||||||||||||||||||
982 | d->columnDelegates.remove(column); | - | ||||||||||||||||||
983 | } never executed: end of block | 0 | ||||||||||||||||||
984 | if (delegate) {
| 0 | ||||||||||||||||||
985 | if (d->delegateRefCount(delegate) == 0) {
| 0 | ||||||||||||||||||
986 | connect(delegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), | - | ||||||||||||||||||
987 | this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); | - | ||||||||||||||||||
988 | connect(delegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); | - | ||||||||||||||||||
989 | connect(delegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(doItemsLayout()), Qt::QueuedConnection); | - | ||||||||||||||||||
990 | } never executed: end of block | 0 | ||||||||||||||||||
991 | d->columnDelegates.insert(column, delegate); | - | ||||||||||||||||||
992 | } never executed: end of block | 0 | ||||||||||||||||||
993 | viewport()->update(); | - | ||||||||||||||||||
994 | d->doDelayedItemsLayout(); | - | ||||||||||||||||||
995 | } never executed: end of block | 0 | ||||||||||||||||||
996 | - | |||||||||||||||||||
997 | /*! | - | ||||||||||||||||||
998 | \since 4.2 | - | ||||||||||||||||||
999 | - | |||||||||||||||||||
1000 | Returns the item delegate used by this view and model for the given \a | - | ||||||||||||||||||
1001 | column. You can call itemDelegate() to get a pointer to the current delegate | - | ||||||||||||||||||
1002 | for a given index. | - | ||||||||||||||||||
1003 | - | |||||||||||||||||||
1004 | \sa setItemDelegateForColumn(), itemDelegateForRow(), itemDelegate() | - | ||||||||||||||||||
1005 | */ | - | ||||||||||||||||||
1006 | QAbstractItemDelegate *QAbstractItemView::itemDelegateForColumn(int column) const | - | ||||||||||||||||||
1007 | { | - | ||||||||||||||||||
1008 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1009 | return d->columnDelegates.value(column, 0); never executed: return d->columnDelegates.value(column, 0); | 0 | ||||||||||||||||||
1010 | } | - | ||||||||||||||||||
1011 | - | |||||||||||||||||||
1012 | /*! | - | ||||||||||||||||||
1013 | Returns the item delegate used by this view and model for | - | ||||||||||||||||||
1014 | the given \a index. | - | ||||||||||||||||||
1015 | */ | - | ||||||||||||||||||
1016 | QAbstractItemDelegate *QAbstractItemView::itemDelegate(const QModelIndex &index) const | - | ||||||||||||||||||
1017 | { | - | ||||||||||||||||||
1018 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1019 | return d->delegateForIndex(index); never executed: return d->delegateForIndex(index); | 0 | ||||||||||||||||||
1020 | } | - | ||||||||||||||||||
1021 | - | |||||||||||||||||||
1022 | /*! | - | ||||||||||||||||||
1023 | \property QAbstractItemView::selectionMode | - | ||||||||||||||||||
1024 | \brief which selection mode the view operates in | - | ||||||||||||||||||
1025 | - | |||||||||||||||||||
1026 | This property controls whether the user can select one or many items | - | ||||||||||||||||||
1027 | and, in many-item selections, whether the selection must be a | - | ||||||||||||||||||
1028 | continuous range of items. | - | ||||||||||||||||||
1029 | - | |||||||||||||||||||
1030 | \sa SelectionMode, SelectionBehavior | - | ||||||||||||||||||
1031 | */ | - | ||||||||||||||||||
1032 | void QAbstractItemView::setSelectionMode(SelectionMode mode) | - | ||||||||||||||||||
1033 | { | - | ||||||||||||||||||
1034 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1035 | d->selectionMode = mode; | - | ||||||||||||||||||
1036 | } never executed: end of block | 0 | ||||||||||||||||||
1037 | - | |||||||||||||||||||
1038 | QAbstractItemView::SelectionMode QAbstractItemView::selectionMode() const | - | ||||||||||||||||||
1039 | { | - | ||||||||||||||||||
1040 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1041 | return d->selectionMode; never executed: return d->selectionMode; | 0 | ||||||||||||||||||
1042 | } | - | ||||||||||||||||||
1043 | - | |||||||||||||||||||
1044 | /*! | - | ||||||||||||||||||
1045 | \property QAbstractItemView::selectionBehavior | - | ||||||||||||||||||
1046 | \brief which selection behavior the view uses | - | ||||||||||||||||||
1047 | - | |||||||||||||||||||
1048 | This property holds whether selections are done | - | ||||||||||||||||||
1049 | in terms of single items, rows or columns. | - | ||||||||||||||||||
1050 | - | |||||||||||||||||||
1051 | \sa SelectionMode, SelectionBehavior | - | ||||||||||||||||||
1052 | */ | - | ||||||||||||||||||
1053 | - | |||||||||||||||||||
1054 | void QAbstractItemView::setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) | - | ||||||||||||||||||
1055 | { | - | ||||||||||||||||||
1056 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1057 | d->selectionBehavior = behavior; | - | ||||||||||||||||||
1058 | } never executed: end of block | 0 | ||||||||||||||||||
1059 | - | |||||||||||||||||||
1060 | QAbstractItemView::SelectionBehavior QAbstractItemView::selectionBehavior() const | - | ||||||||||||||||||
1061 | { | - | ||||||||||||||||||
1062 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1063 | return d->selectionBehavior; never executed: return d->selectionBehavior; | 0 | ||||||||||||||||||
1064 | } | - | ||||||||||||||||||
1065 | - | |||||||||||||||||||
1066 | /*! | - | ||||||||||||||||||
1067 | Sets the current item to be the item at \a index. | - | ||||||||||||||||||
1068 | - | |||||||||||||||||||
1069 | Unless the current selection mode is | - | ||||||||||||||||||
1070 | \l{QAbstractItemView::}{NoSelection}, the item is also selected. | - | ||||||||||||||||||
1071 | Note that this function also updates the starting position for any | - | ||||||||||||||||||
1072 | new selections the user performs. | - | ||||||||||||||||||
1073 | - | |||||||||||||||||||
1074 | To set an item as the current item without selecting it, call | - | ||||||||||||||||||
1075 | - | |||||||||||||||||||
1076 | \c{selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);} | - | ||||||||||||||||||
1077 | - | |||||||||||||||||||
1078 | \sa currentIndex(), currentChanged(), selectionMode | - | ||||||||||||||||||
1079 | */ | - | ||||||||||||||||||
1080 | void QAbstractItemView::setCurrentIndex(const QModelIndex &index) | - | ||||||||||||||||||
1081 | { | - | ||||||||||||||||||
1082 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1083 | if (d->selectionModel && (!index.isValid() || d->isIndexEnabled(index))) {
| 0 | ||||||||||||||||||
1084 | QItemSelectionModel::SelectionFlags command = selectionCommand(index, 0); | - | ||||||||||||||||||
1085 | d->selectionModel->setCurrentIndex(index, command); | - | ||||||||||||||||||
1086 | d->currentIndexSet = true; | - | ||||||||||||||||||
1087 | if ((command & QItemSelectionModel::Current) == 0)
| 0 | ||||||||||||||||||
1088 | d->currentSelectionStartIndex = index; never executed: d->currentSelectionStartIndex = index; | 0 | ||||||||||||||||||
1089 | } never executed: end of block | 0 | ||||||||||||||||||
1090 | } never executed: end of block | 0 | ||||||||||||||||||
1091 | - | |||||||||||||||||||
1092 | /*! | - | ||||||||||||||||||
1093 | Returns the model index of the current item. | - | ||||||||||||||||||
1094 | - | |||||||||||||||||||
1095 | \sa setCurrentIndex() | - | ||||||||||||||||||
1096 | */ | - | ||||||||||||||||||
1097 | QModelIndex QAbstractItemView::currentIndex() const | - | ||||||||||||||||||
1098 | { | - | ||||||||||||||||||
1099 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1100 | return d->selectionModel ? d->selectionModel->currentIndex() : QModelIndex(); never executed: return d->selectionModel ? d->selectionModel->currentIndex() : QModelIndex(); | 0 | ||||||||||||||||||
1101 | } | - | ||||||||||||||||||
1102 | - | |||||||||||||||||||
1103 | - | |||||||||||||||||||
1104 | /*! | - | ||||||||||||||||||
1105 | Reset the internal state of the view. | - | ||||||||||||||||||
1106 | - | |||||||||||||||||||
1107 | \warning This function will reset open editors, scroll bar positions, | - | ||||||||||||||||||
1108 | selections, etc. Existing changes will not be committed. If you would like | - | ||||||||||||||||||
1109 | to save your changes when resetting the view, you can reimplement this | - | ||||||||||||||||||
1110 | function, commit your changes, and then call the superclass' | - | ||||||||||||||||||
1111 | implementation. | - | ||||||||||||||||||
1112 | */ | - | ||||||||||||||||||
1113 | void QAbstractItemView::reset() | - | ||||||||||||||||||
1114 | { | - | ||||||||||||||||||
1115 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1116 | d->delayedReset.stop(); //make sure we stop the timer | - | ||||||||||||||||||
1117 | foreach (const QEditorInfo &info, d->indexEditorHash) { | - | ||||||||||||||||||
1118 | if (info.widget)
| 0 | ||||||||||||||||||
1119 | d->releaseEditor(info.widget.data(), d->indexForEditor(info.widget.data())); never executed: d->releaseEditor(info.widget.data(), d->indexForEditor(info.widget.data())); | 0 | ||||||||||||||||||
1120 | } never executed: end of block | 0 | ||||||||||||||||||
1121 | d->editorIndexHash.clear(); | - | ||||||||||||||||||
1122 | d->indexEditorHash.clear(); | - | ||||||||||||||||||
1123 | d->persistent.clear(); | - | ||||||||||||||||||
1124 | d->currentIndexSet = false; | - | ||||||||||||||||||
1125 | setState(NoState); | - | ||||||||||||||||||
1126 | setRootIndex(QModelIndex()); | - | ||||||||||||||||||
1127 | if (d->selectionModel)
| 0 | ||||||||||||||||||
1128 | d->selectionModel->reset(); never executed: d->selectionModel->reset(); | 0 | ||||||||||||||||||
1129 | #ifndef QT_NO_ACCESSIBILITY | - | ||||||||||||||||||
1130 | if (QAccessible::isActive()) {
| 0 | ||||||||||||||||||
1131 | QAccessibleTableModelChangeEvent accessibleEvent(this, QAccessibleTableModelChangeEvent::ModelReset); | - | ||||||||||||||||||
1132 | QAccessible::updateAccessibility(&accessibleEvent); | - | ||||||||||||||||||
1133 | } never executed: end of block | 0 | ||||||||||||||||||
1134 | #endif | - | ||||||||||||||||||
1135 | d->updateGeometry(); | - | ||||||||||||||||||
1136 | } never executed: end of block | 0 | ||||||||||||||||||
1137 | - | |||||||||||||||||||
1138 | /*! | - | ||||||||||||||||||
1139 | Sets the root item to the item at the given \a index. | - | ||||||||||||||||||
1140 | - | |||||||||||||||||||
1141 | \sa rootIndex() | - | ||||||||||||||||||
1142 | */ | - | ||||||||||||||||||
1143 | void QAbstractItemView::setRootIndex(const QModelIndex &index) | - | ||||||||||||||||||
1144 | { | - | ||||||||||||||||||
1145 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1146 | if (Q_UNLIKELY(index.isValid() && index.model() != d->model)) {
| 0 | ||||||||||||||||||
1147 | qWarning("QAbstractItemView::setRootIndex failed : index must be from the currently set model"); | - | ||||||||||||||||||
1148 | return; never executed: return; | 0 | ||||||||||||||||||
1149 | } | - | ||||||||||||||||||
1150 | d->root = index; | - | ||||||||||||||||||
1151 | d->doDelayedItemsLayout(); | - | ||||||||||||||||||
1152 | d->updateGeometry(); | - | ||||||||||||||||||
1153 | } never executed: end of block | 0 | ||||||||||||||||||
1154 | - | |||||||||||||||||||
1155 | /*! | - | ||||||||||||||||||
1156 | Returns the model index of the model's root item. The root item is | - | ||||||||||||||||||
1157 | the parent item to the view's toplevel items. The root can be invalid. | - | ||||||||||||||||||
1158 | - | |||||||||||||||||||
1159 | \sa setRootIndex() | - | ||||||||||||||||||
1160 | */ | - | ||||||||||||||||||
1161 | QModelIndex QAbstractItemView::rootIndex() const | - | ||||||||||||||||||
1162 | { | - | ||||||||||||||||||
1163 | return QModelIndex(d_func()->root); never executed: return QModelIndex(d_func()->root); | 0 | ||||||||||||||||||
1164 | } | - | ||||||||||||||||||
1165 | - | |||||||||||||||||||
1166 | /*! | - | ||||||||||||||||||
1167 | Selects all items in the view. | - | ||||||||||||||||||
1168 | This function will use the selection behavior | - | ||||||||||||||||||
1169 | set on the view when selecting. | - | ||||||||||||||||||
1170 | - | |||||||||||||||||||
1171 | \sa setSelection(), selectedIndexes(), clearSelection() | - | ||||||||||||||||||
1172 | */ | - | ||||||||||||||||||
1173 | void QAbstractItemView::selectAll() | - | ||||||||||||||||||
1174 | { | - | ||||||||||||||||||
1175 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1176 | SelectionMode mode = d->selectionMode; | - | ||||||||||||||||||
1177 | if (mode == MultiSelection || mode == ExtendedSelection)
| 0 | ||||||||||||||||||
1178 | d->selectAll(QItemSelectionModel::ClearAndSelect never executed: d->selectAll(QItemSelectionModel::ClearAndSelect |d->selectionBehaviorFlags()); | 0 | ||||||||||||||||||
1179 | |d->selectionBehaviorFlags()); never executed: d->selectAll(QItemSelectionModel::ClearAndSelect |d->selectionBehaviorFlags()); | 0 | ||||||||||||||||||
1180 | else if (mode != SingleSelection)
| 0 | ||||||||||||||||||
1181 | d->selectAll(selectionCommand(d->model->index(0, 0, d->root))); never executed: d->selectAll(selectionCommand(d->model->index(0, 0, d->root))); | 0 | ||||||||||||||||||
1182 | } never executed: end of block | 0 | ||||||||||||||||||
1183 | - | |||||||||||||||||||
1184 | /*! | - | ||||||||||||||||||
1185 | Starts editing the item corresponding to the given \a index if it is | - | ||||||||||||||||||
1186 | editable. | - | ||||||||||||||||||
1187 | - | |||||||||||||||||||
1188 | Note that this function does not change the current index. Since the current | - | ||||||||||||||||||
1189 | index defines the next and previous items to edit, users may find that | - | ||||||||||||||||||
1190 | keyboard navigation does not work as expected. To provide consistent navigation | - | ||||||||||||||||||
1191 | behavior, call setCurrentIndex() before this function with the same model | - | ||||||||||||||||||
1192 | index. | - | ||||||||||||||||||
1193 | - | |||||||||||||||||||
1194 | \sa QModelIndex::flags() | - | ||||||||||||||||||
1195 | */ | - | ||||||||||||||||||
1196 | void QAbstractItemView::edit(const QModelIndex &index) | - | ||||||||||||||||||
1197 | { | - | ||||||||||||||||||
1198 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1199 | if (Q_UNLIKELY(!d->isIndexValid(index)))
| 0 | ||||||||||||||||||
1200 | qWarning("edit: index was invalid"); never executed: QMessageLogger(__FILE__, 1200, __PRETTY_FUNCTION__).warning("edit: index was invalid"); | 0 | ||||||||||||||||||
1201 | if (Q_UNLIKELY(!edit(index, AllEditTriggers, 0)))
| 0 | ||||||||||||||||||
1202 | qWarning("edit: editing failed"); never executed: QMessageLogger(__FILE__, 1202, __PRETTY_FUNCTION__).warning("edit: editing failed"); | 0 | ||||||||||||||||||
1203 | } never executed: end of block | 0 | ||||||||||||||||||
1204 | - | |||||||||||||||||||
1205 | /*! | - | ||||||||||||||||||
1206 | Deselects all selected items. The current index will not be changed. | - | ||||||||||||||||||
1207 | - | |||||||||||||||||||
1208 | \sa setSelection(), selectAll() | - | ||||||||||||||||||
1209 | */ | - | ||||||||||||||||||
1210 | void QAbstractItemView::clearSelection() | - | ||||||||||||||||||
1211 | { | - | ||||||||||||||||||
1212 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1213 | if (d->selectionModel)
| 0 | ||||||||||||||||||
1214 | d->selectionModel->clearSelection(); never executed: d->selectionModel->clearSelection(); | 0 | ||||||||||||||||||
1215 | } never executed: end of block | 0 | ||||||||||||||||||
1216 | - | |||||||||||||||||||
1217 | /*! | - | ||||||||||||||||||
1218 | \internal | - | ||||||||||||||||||
1219 | - | |||||||||||||||||||
1220 | This function is intended to lay out the items in the view. | - | ||||||||||||||||||
1221 | The default implementation just calls updateGeometries() and updates the viewport. | - | ||||||||||||||||||
1222 | */ | - | ||||||||||||||||||
1223 | void QAbstractItemView::doItemsLayout() | - | ||||||||||||||||||
1224 | { | - | ||||||||||||||||||
1225 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1226 | d->interruptDelayedItemsLayout(); | - | ||||||||||||||||||
1227 | updateGeometries(); | - | ||||||||||||||||||
1228 | d->viewport->update(); | - | ||||||||||||||||||
1229 | } never executed: end of block | 0 | ||||||||||||||||||
1230 | - | |||||||||||||||||||
1231 | /*! | - | ||||||||||||||||||
1232 | \property QAbstractItemView::editTriggers | - | ||||||||||||||||||
1233 | \brief which actions will initiate item editing | - | ||||||||||||||||||
1234 | - | |||||||||||||||||||
1235 | This property is a selection of flags defined by | - | ||||||||||||||||||
1236 | \l{EditTrigger}, combined using the OR | - | ||||||||||||||||||
1237 | operator. The view will only initiate the editing of an item if the | - | ||||||||||||||||||
1238 | action performed is set in this property. | - | ||||||||||||||||||
1239 | */ | - | ||||||||||||||||||
1240 | void QAbstractItemView::setEditTriggers(EditTriggers actions) | - | ||||||||||||||||||
1241 | { | - | ||||||||||||||||||
1242 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1243 | d->editTriggers = actions; | - | ||||||||||||||||||
1244 | } never executed: end of block | 0 | ||||||||||||||||||
1245 | - | |||||||||||||||||||
1246 | QAbstractItemView::EditTriggers QAbstractItemView::editTriggers() const | - | ||||||||||||||||||
1247 | { | - | ||||||||||||||||||
1248 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1249 | return d->editTriggers; never executed: return d->editTriggers; | 0 | ||||||||||||||||||
1250 | } | - | ||||||||||||||||||
1251 | - | |||||||||||||||||||
1252 | /*! | - | ||||||||||||||||||
1253 | \since 4.2 | - | ||||||||||||||||||
1254 | \property QAbstractItemView::verticalScrollMode | - | ||||||||||||||||||
1255 | \brief how the view scrolls its contents in the vertical direction | - | ||||||||||||||||||
1256 | - | |||||||||||||||||||
1257 | This property controls how the view scroll its contents vertically. | - | ||||||||||||||||||
1258 | Scrolling can be done either per pixel or per item. Its default value | - | ||||||||||||||||||
1259 | comes from the style via the QStyle::SH_ItemView_ScrollMode style hint. | - | ||||||||||||||||||
1260 | */ | - | ||||||||||||||||||
1261 | - | |||||||||||||||||||
1262 | void QAbstractItemView::setVerticalScrollMode(ScrollMode mode) | - | ||||||||||||||||||
1263 | { | - | ||||||||||||||||||
1264 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1265 | d->verticalScrollModeSet = true; | - | ||||||||||||||||||
1266 | if (mode == d->verticalScrollMode)
| 0 | ||||||||||||||||||
1267 | return; never executed: return; | 0 | ||||||||||||||||||
1268 | QModelIndex topLeft = indexAt(QPoint(0, 0)); | - | ||||||||||||||||||
1269 | d->verticalScrollMode = mode; | - | ||||||||||||||||||
1270 | if (mode == ScrollPerItem)
| 0 | ||||||||||||||||||
1271 | verticalScrollBar()->d_func()->itemviewChangeSingleStep(1); // setSingleStep(-1) => step with 1 never executed: verticalScrollBar()->d_func()->itemviewChangeSingleStep(1); | 0 | ||||||||||||||||||
1272 | else | - | ||||||||||||||||||
1273 | verticalScrollBar()->setSingleStep(-1); // Ensure that the view can update single step never executed: verticalScrollBar()->setSingleStep(-1); | 0 | ||||||||||||||||||
1274 | updateGeometries(); // update the scroll bars | - | ||||||||||||||||||
1275 | scrollTo(topLeft, QAbstractItemView::PositionAtTop); | - | ||||||||||||||||||
1276 | } never executed: end of block | 0 | ||||||||||||||||||
1277 | - | |||||||||||||||||||
1278 | QAbstractItemView::ScrollMode QAbstractItemView::verticalScrollMode() const | - | ||||||||||||||||||
1279 | { | - | ||||||||||||||||||
1280 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1281 | return d->verticalScrollMode; never executed: return d->verticalScrollMode; | 0 | ||||||||||||||||||
1282 | } | - | ||||||||||||||||||
1283 | - | |||||||||||||||||||
1284 | void QAbstractItemView::resetVerticalScrollMode() | - | ||||||||||||||||||
1285 | { | - | ||||||||||||||||||
1286 | auto sm = static_cast<ScrollMode>(style()->styleHint(QStyle::SH_ItemView_ScrollMode, 0, this, 0)); | - | ||||||||||||||||||
1287 | setVerticalScrollMode(sm); | - | ||||||||||||||||||
1288 | d_func()->verticalScrollModeSet = false; | - | ||||||||||||||||||
1289 | } never executed: end of block | 0 | ||||||||||||||||||
1290 | - | |||||||||||||||||||
1291 | /*! | - | ||||||||||||||||||
1292 | \since 4.2 | - | ||||||||||||||||||
1293 | \property QAbstractItemView::horizontalScrollMode | - | ||||||||||||||||||
1294 | \brief how the view scrolls its contents in the horizontal direction | - | ||||||||||||||||||
1295 | - | |||||||||||||||||||
1296 | This property controls how the view scroll its contents horizontally. | - | ||||||||||||||||||
1297 | Scrolling can be done either per pixel or per item. Its default value | - | ||||||||||||||||||
1298 | comes from the style via the QStyle::SH_ItemView_ScrollMode style hint. | - | ||||||||||||||||||
1299 | */ | - | ||||||||||||||||||
1300 | - | |||||||||||||||||||
1301 | void QAbstractItemView::setHorizontalScrollMode(ScrollMode mode) | - | ||||||||||||||||||
1302 | { | - | ||||||||||||||||||
1303 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1304 | d->horizontalScrollModeSet = true; | - | ||||||||||||||||||
1305 | if (mode == d->horizontalScrollMode)
| 0 | ||||||||||||||||||
1306 | return; never executed: return; | 0 | ||||||||||||||||||
1307 | d->horizontalScrollMode = mode; | - | ||||||||||||||||||
1308 | if (mode == ScrollPerItem)
| 0 | ||||||||||||||||||
1309 | horizontalScrollBar()->d_func()->itemviewChangeSingleStep(1); // setSingleStep(-1) => step with 1 never executed: horizontalScrollBar()->d_func()->itemviewChangeSingleStep(1); | 0 | ||||||||||||||||||
1310 | else | - | ||||||||||||||||||
1311 | horizontalScrollBar()->setSingleStep(-1); // Ensure that the view can update single step never executed: horizontalScrollBar()->setSingleStep(-1); | 0 | ||||||||||||||||||
1312 | updateGeometries(); // update the scroll bars | - | ||||||||||||||||||
1313 | } never executed: end of block | 0 | ||||||||||||||||||
1314 | - | |||||||||||||||||||
1315 | QAbstractItemView::ScrollMode QAbstractItemView::horizontalScrollMode() const | - | ||||||||||||||||||
1316 | { | - | ||||||||||||||||||
1317 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1318 | return d->horizontalScrollMode; never executed: return d->horizontalScrollMode; | 0 | ||||||||||||||||||
1319 | } | - | ||||||||||||||||||
1320 | - | |||||||||||||||||||
1321 | void QAbstractItemView::resetHorizontalScrollMode() | - | ||||||||||||||||||
1322 | { | - | ||||||||||||||||||
1323 | auto sm = static_cast<ScrollMode>(style()->styleHint(QStyle::SH_ItemView_ScrollMode, 0, this, 0)); | - | ||||||||||||||||||
1324 | setHorizontalScrollMode(sm); | - | ||||||||||||||||||
1325 | d_func()->horizontalScrollModeSet = false; | - | ||||||||||||||||||
1326 | } never executed: end of block | 0 | ||||||||||||||||||
1327 | - | |||||||||||||||||||
1328 | #ifndef QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1329 | /*! | - | ||||||||||||||||||
1330 | \since 4.2 | - | ||||||||||||||||||
1331 | \property QAbstractItemView::dragDropOverwriteMode | - | ||||||||||||||||||
1332 | \brief the view's drag and drop behavior | - | ||||||||||||||||||
1333 | - | |||||||||||||||||||
1334 | If its value is \c true, the selected data will overwrite the | - | ||||||||||||||||||
1335 | existing item data when dropped, while moving the data will clear | - | ||||||||||||||||||
1336 | the item. If its value is \c false, the selected data will be | - | ||||||||||||||||||
1337 | inserted as a new item when the data is dropped. When the data is | - | ||||||||||||||||||
1338 | moved, the item is removed as well. | - | ||||||||||||||||||
1339 | - | |||||||||||||||||||
1340 | The default value is \c false, as in the QListView and QTreeView | - | ||||||||||||||||||
1341 | subclasses. In the QTableView subclass, on the other hand, the | - | ||||||||||||||||||
1342 | property has been set to \c true. | - | ||||||||||||||||||
1343 | - | |||||||||||||||||||
1344 | Note: This is not intended to prevent overwriting of items. | - | ||||||||||||||||||
1345 | The model's implementation of flags() should do that by not | - | ||||||||||||||||||
1346 | returning Qt::ItemIsDropEnabled. | - | ||||||||||||||||||
1347 | - | |||||||||||||||||||
1348 | \sa dragDropMode | - | ||||||||||||||||||
1349 | */ | - | ||||||||||||||||||
1350 | void QAbstractItemView::setDragDropOverwriteMode(bool overwrite) | - | ||||||||||||||||||
1351 | { | - | ||||||||||||||||||
1352 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1353 | d->overwrite = overwrite; | - | ||||||||||||||||||
1354 | } never executed: end of block | 0 | ||||||||||||||||||
1355 | - | |||||||||||||||||||
1356 | bool QAbstractItemView::dragDropOverwriteMode() const | - | ||||||||||||||||||
1357 | { | - | ||||||||||||||||||
1358 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1359 | return d->overwrite; never executed: return d->overwrite; | 0 | ||||||||||||||||||
1360 | } | - | ||||||||||||||||||
1361 | #endif | - | ||||||||||||||||||
1362 | - | |||||||||||||||||||
1363 | /*! | - | ||||||||||||||||||
1364 | \property QAbstractItemView::autoScroll | - | ||||||||||||||||||
1365 | \brief whether autoscrolling in drag move events is enabled | - | ||||||||||||||||||
1366 | - | |||||||||||||||||||
1367 | If this property is set to true (the default), the | - | ||||||||||||||||||
1368 | QAbstractItemView automatically scrolls the contents of the view | - | ||||||||||||||||||
1369 | if the user drags within 16 pixels of the viewport edge. If the current | - | ||||||||||||||||||
1370 | item changes, then the view will scroll automatically to ensure that the | - | ||||||||||||||||||
1371 | current item is fully visible. | - | ||||||||||||||||||
1372 | - | |||||||||||||||||||
1373 | This property only works if the viewport accepts drops. Autoscroll is | - | ||||||||||||||||||
1374 | switched off by setting this property to false. | - | ||||||||||||||||||
1375 | */ | - | ||||||||||||||||||
1376 | - | |||||||||||||||||||
1377 | void QAbstractItemView::setAutoScroll(bool enable) | - | ||||||||||||||||||
1378 | { | - | ||||||||||||||||||
1379 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1380 | d->autoScroll = enable; | - | ||||||||||||||||||
1381 | } never executed: end of block | 0 | ||||||||||||||||||
1382 | - | |||||||||||||||||||
1383 | bool QAbstractItemView::hasAutoScroll() const | - | ||||||||||||||||||
1384 | { | - | ||||||||||||||||||
1385 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1386 | return d->autoScroll; never executed: return d->autoScroll; | 0 | ||||||||||||||||||
1387 | } | - | ||||||||||||||||||
1388 | - | |||||||||||||||||||
1389 | /*! | - | ||||||||||||||||||
1390 | \since 4.4 | - | ||||||||||||||||||
1391 | \property QAbstractItemView::autoScrollMargin | - | ||||||||||||||||||
1392 | \brief the size of the area when auto scrolling is triggered | - | ||||||||||||||||||
1393 | - | |||||||||||||||||||
1394 | This property controls the size of the area at the edge of the viewport that | - | ||||||||||||||||||
1395 | triggers autoscrolling. The default value is 16 pixels. | - | ||||||||||||||||||
1396 | */ | - | ||||||||||||||||||
1397 | void QAbstractItemView::setAutoScrollMargin(int margin) | - | ||||||||||||||||||
1398 | { | - | ||||||||||||||||||
1399 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1400 | d->autoScrollMargin = margin; | - | ||||||||||||||||||
1401 | } never executed: end of block | 0 | ||||||||||||||||||
1402 | - | |||||||||||||||||||
1403 | int QAbstractItemView::autoScrollMargin() const | - | ||||||||||||||||||
1404 | { | - | ||||||||||||||||||
1405 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1406 | return d->autoScrollMargin; never executed: return d->autoScrollMargin; | 0 | ||||||||||||||||||
1407 | } | - | ||||||||||||||||||
1408 | - | |||||||||||||||||||
1409 | /*! | - | ||||||||||||||||||
1410 | \property QAbstractItemView::tabKeyNavigation | - | ||||||||||||||||||
1411 | \brief whether item navigation with tab and backtab is enabled. | - | ||||||||||||||||||
1412 | */ | - | ||||||||||||||||||
1413 | - | |||||||||||||||||||
1414 | void QAbstractItemView::setTabKeyNavigation(bool enable) | - | ||||||||||||||||||
1415 | { | - | ||||||||||||||||||
1416 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1417 | d->tabKeyNavigation = enable; | - | ||||||||||||||||||
1418 | } never executed: end of block | 0 | ||||||||||||||||||
1419 | - | |||||||||||||||||||
1420 | bool QAbstractItemView::tabKeyNavigation() const | - | ||||||||||||||||||
1421 | { | - | ||||||||||||||||||
1422 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1423 | return d->tabKeyNavigation; never executed: return d->tabKeyNavigation; | 0 | ||||||||||||||||||
1424 | } | - | ||||||||||||||||||
1425 | - | |||||||||||||||||||
1426 | /*! | - | ||||||||||||||||||
1427 | \since 5.2 | - | ||||||||||||||||||
1428 | \reimp | - | ||||||||||||||||||
1429 | */ | - | ||||||||||||||||||
1430 | QSize QAbstractItemView::viewportSizeHint() const | - | ||||||||||||||||||
1431 | { | - | ||||||||||||||||||
1432 | return QAbstractScrollArea::viewportSizeHint(); never executed: return QAbstractScrollArea::viewportSizeHint(); | 0 | ||||||||||||||||||
1433 | } | - | ||||||||||||||||||
1434 | - | |||||||||||||||||||
1435 | #ifndef QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1436 | /*! | - | ||||||||||||||||||
1437 | \property QAbstractItemView::showDropIndicator | - | ||||||||||||||||||
1438 | \brief whether the drop indicator is shown when dragging items and dropping. | - | ||||||||||||||||||
1439 | - | |||||||||||||||||||
1440 | \sa dragEnabled, DragDropMode, dragDropOverwriteMode, acceptDrops | - | ||||||||||||||||||
1441 | */ | - | ||||||||||||||||||
1442 | - | |||||||||||||||||||
1443 | void QAbstractItemView::setDropIndicatorShown(bool enable) | - | ||||||||||||||||||
1444 | { | - | ||||||||||||||||||
1445 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1446 | d->showDropIndicator = enable; | - | ||||||||||||||||||
1447 | } never executed: end of block | 0 | ||||||||||||||||||
1448 | - | |||||||||||||||||||
1449 | bool QAbstractItemView::showDropIndicator() const | - | ||||||||||||||||||
1450 | { | - | ||||||||||||||||||
1451 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1452 | return d->showDropIndicator; never executed: return d->showDropIndicator; | 0 | ||||||||||||||||||
1453 | } | - | ||||||||||||||||||
1454 | - | |||||||||||||||||||
1455 | /*! | - | ||||||||||||||||||
1456 | \property QAbstractItemView::dragEnabled | - | ||||||||||||||||||
1457 | \brief whether the view supports dragging of its own items | - | ||||||||||||||||||
1458 | - | |||||||||||||||||||
1459 | \sa showDropIndicator, DragDropMode, dragDropOverwriteMode, acceptDrops | - | ||||||||||||||||||
1460 | */ | - | ||||||||||||||||||
1461 | - | |||||||||||||||||||
1462 | void QAbstractItemView::setDragEnabled(bool enable) | - | ||||||||||||||||||
1463 | { | - | ||||||||||||||||||
1464 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1465 | d->dragEnabled = enable; | - | ||||||||||||||||||
1466 | } never executed: end of block | 0 | ||||||||||||||||||
1467 | - | |||||||||||||||||||
1468 | bool QAbstractItemView::dragEnabled() const | - | ||||||||||||||||||
1469 | { | - | ||||||||||||||||||
1470 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1471 | return d->dragEnabled; never executed: return d->dragEnabled; | 0 | ||||||||||||||||||
1472 | } | - | ||||||||||||||||||
1473 | - | |||||||||||||||||||
1474 | /*! | - | ||||||||||||||||||
1475 | \since 4.2 | - | ||||||||||||||||||
1476 | \enum QAbstractItemView::DragDropMode | - | ||||||||||||||||||
1477 | - | |||||||||||||||||||
1478 | Describes the various drag and drop events the view can act upon. | - | ||||||||||||||||||
1479 | By default the view does not support dragging or dropping (\c | - | ||||||||||||||||||
1480 | NoDragDrop). | - | ||||||||||||||||||
1481 | - | |||||||||||||||||||
1482 | \value NoDragDrop Does not support dragging or dropping. | - | ||||||||||||||||||
1483 | \value DragOnly The view supports dragging of its own items | - | ||||||||||||||||||
1484 | \value DropOnly The view accepts drops | - | ||||||||||||||||||
1485 | \value DragDrop The view supports both dragging and dropping | - | ||||||||||||||||||
1486 | \value InternalMove The view accepts move (\b{not copy}) operations only | - | ||||||||||||||||||
1487 | from itself. | - | ||||||||||||||||||
1488 | - | |||||||||||||||||||
1489 | Note that the model used needs to provide support for drag and drop operations. | - | ||||||||||||||||||
1490 | - | |||||||||||||||||||
1491 | \sa setDragDropMode(), {Using drag and drop with item views} | - | ||||||||||||||||||
1492 | */ | - | ||||||||||||||||||
1493 | - | |||||||||||||||||||
1494 | /*! | - | ||||||||||||||||||
1495 | \property QAbstractItemView::dragDropMode | - | ||||||||||||||||||
1496 | \brief the drag and drop event the view will act upon | - | ||||||||||||||||||
1497 | - | |||||||||||||||||||
1498 | \since 4.2 | - | ||||||||||||||||||
1499 | \sa showDropIndicator, dragDropOverwriteMode | - | ||||||||||||||||||
1500 | */ | - | ||||||||||||||||||
1501 | void QAbstractItemView::setDragDropMode(DragDropMode behavior) | - | ||||||||||||||||||
1502 | { | - | ||||||||||||||||||
1503 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1504 | d->dragDropMode = behavior; | - | ||||||||||||||||||
1505 | setDragEnabled(behavior == DragOnly || behavior == DragDrop || behavior == InternalMove); | - | ||||||||||||||||||
1506 | setAcceptDrops(behavior == DropOnly || behavior == DragDrop || behavior == InternalMove); | - | ||||||||||||||||||
1507 | } never executed: end of block | 0 | ||||||||||||||||||
1508 | - | |||||||||||||||||||
1509 | QAbstractItemView::DragDropMode QAbstractItemView::dragDropMode() const | - | ||||||||||||||||||
1510 | { | - | ||||||||||||||||||
1511 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1512 | DragDropMode setBehavior = d->dragDropMode; | - | ||||||||||||||||||
1513 | if (!dragEnabled() && !acceptDrops())
| 0 | ||||||||||||||||||
1514 | return NoDragDrop; never executed: return NoDragDrop; | 0 | ||||||||||||||||||
1515 | - | |||||||||||||||||||
1516 | if (dragEnabled() && !acceptDrops())
| 0 | ||||||||||||||||||
1517 | return DragOnly; never executed: return DragOnly; | 0 | ||||||||||||||||||
1518 | - | |||||||||||||||||||
1519 | if (!dragEnabled() && acceptDrops())
| 0 | ||||||||||||||||||
1520 | return DropOnly; never executed: return DropOnly; | 0 | ||||||||||||||||||
1521 | - | |||||||||||||||||||
1522 | if (dragEnabled() && acceptDrops()) {
| 0 | ||||||||||||||||||
1523 | if (setBehavior == InternalMove)
| 0 | ||||||||||||||||||
1524 | return setBehavior; never executed: return setBehavior; | 0 | ||||||||||||||||||
1525 | else | - | ||||||||||||||||||
1526 | return DragDrop; never executed: return DragDrop; | 0 | ||||||||||||||||||
1527 | } | - | ||||||||||||||||||
1528 | - | |||||||||||||||||||
1529 | return NoDragDrop; never executed: return NoDragDrop; | 0 | ||||||||||||||||||
1530 | } | - | ||||||||||||||||||
1531 | - | |||||||||||||||||||
1532 | /*! | - | ||||||||||||||||||
1533 | \property QAbstractItemView::defaultDropAction | - | ||||||||||||||||||
1534 | \brief the drop action that will be used by default in QAbstractItemView::drag() | - | ||||||||||||||||||
1535 | - | |||||||||||||||||||
1536 | If the property is not set, the drop action is CopyAction when the supported | - | ||||||||||||||||||
1537 | actions support CopyAction. | - | ||||||||||||||||||
1538 | - | |||||||||||||||||||
1539 | \since 4.6 | - | ||||||||||||||||||
1540 | \sa showDropIndicator, dragDropOverwriteMode | - | ||||||||||||||||||
1541 | */ | - | ||||||||||||||||||
1542 | void QAbstractItemView::setDefaultDropAction(Qt::DropAction dropAction) | - | ||||||||||||||||||
1543 | { | - | ||||||||||||||||||
1544 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1545 | d->defaultDropAction = dropAction; | - | ||||||||||||||||||
1546 | } never executed: end of block | 0 | ||||||||||||||||||
1547 | - | |||||||||||||||||||
1548 | Qt::DropAction QAbstractItemView::defaultDropAction() const | - | ||||||||||||||||||
1549 | { | - | ||||||||||||||||||
1550 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1551 | return d->defaultDropAction; never executed: return d->defaultDropAction; | 0 | ||||||||||||||||||
1552 | } | - | ||||||||||||||||||
1553 | - | |||||||||||||||||||
1554 | #endif // QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1555 | - | |||||||||||||||||||
1556 | /*! | - | ||||||||||||||||||
1557 | \property QAbstractItemView::alternatingRowColors | - | ||||||||||||||||||
1558 | \brief whether to draw the background using alternating colors | - | ||||||||||||||||||
1559 | - | |||||||||||||||||||
1560 | If this property is \c true, the item background will be drawn using | - | ||||||||||||||||||
1561 | QPalette::Base and QPalette::AlternateBase; otherwise the background | - | ||||||||||||||||||
1562 | will be drawn using the QPalette::Base color. | - | ||||||||||||||||||
1563 | - | |||||||||||||||||||
1564 | By default, this property is \c false. | - | ||||||||||||||||||
1565 | */ | - | ||||||||||||||||||
1566 | void QAbstractItemView::setAlternatingRowColors(bool enable) | - | ||||||||||||||||||
1567 | { | - | ||||||||||||||||||
1568 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1569 | d->alternatingColors = enable; | - | ||||||||||||||||||
1570 | if (isVisible())
| 0 | ||||||||||||||||||
1571 | d->viewport->update(); never executed: d->viewport->update(); | 0 | ||||||||||||||||||
1572 | } never executed: end of block | 0 | ||||||||||||||||||
1573 | - | |||||||||||||||||||
1574 | bool QAbstractItemView::alternatingRowColors() const | - | ||||||||||||||||||
1575 | { | - | ||||||||||||||||||
1576 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1577 | return d->alternatingColors; never executed: return d->alternatingColors; | 0 | ||||||||||||||||||
1578 | } | - | ||||||||||||||||||
1579 | - | |||||||||||||||||||
1580 | /*! | - | ||||||||||||||||||
1581 | \property QAbstractItemView::iconSize | - | ||||||||||||||||||
1582 | \brief the size of items' icons | - | ||||||||||||||||||
1583 | - | |||||||||||||||||||
1584 | Setting this property when the view is visible will cause the | - | ||||||||||||||||||
1585 | items to be laid out again. | - | ||||||||||||||||||
1586 | */ | - | ||||||||||||||||||
1587 | void QAbstractItemView::setIconSize(const QSize &size) | - | ||||||||||||||||||
1588 | { | - | ||||||||||||||||||
1589 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1590 | if (size == d->iconSize)
| 0 | ||||||||||||||||||
1591 | return; never executed: return; | 0 | ||||||||||||||||||
1592 | d->iconSize = size; | - | ||||||||||||||||||
1593 | d->doDelayedItemsLayout(); | - | ||||||||||||||||||
1594 | emit iconSizeChanged(size); | - | ||||||||||||||||||
1595 | } never executed: end of block | 0 | ||||||||||||||||||
1596 | - | |||||||||||||||||||
1597 | QSize QAbstractItemView::iconSize() const | - | ||||||||||||||||||
1598 | { | - | ||||||||||||||||||
1599 | Q_D(const QAbstractItemView); | - | ||||||||||||||||||
1600 | return d->iconSize; never executed: return d->iconSize; | 0 | ||||||||||||||||||
1601 | } | - | ||||||||||||||||||
1602 | - | |||||||||||||||||||
1603 | /*! | - | ||||||||||||||||||
1604 | \property QAbstractItemView::textElideMode | - | ||||||||||||||||||
1605 | - | |||||||||||||||||||
1606 | \brief the position of the "..." in elided text. | - | ||||||||||||||||||
1607 | - | |||||||||||||||||||
1608 | The default value for all item views is Qt::ElideRight. | - | ||||||||||||||||||
1609 | */ | - | ||||||||||||||||||
1610 | void QAbstractItemView::setTextElideMode(Qt::TextElideMode mode) | - | ||||||||||||||||||
1611 | { | - | ||||||||||||||||||
1612 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1613 | d->textElideMode = mode; | - | ||||||||||||||||||
1614 | } never executed: end of block | 0 | ||||||||||||||||||
1615 | - | |||||||||||||||||||
1616 | Qt::TextElideMode QAbstractItemView::textElideMode() const | - | ||||||||||||||||||
1617 | { | - | ||||||||||||||||||
1618 | return d_func()->textElideMode; never executed: return d_func()->textElideMode; | 0 | ||||||||||||||||||
1619 | } | - | ||||||||||||||||||
1620 | - | |||||||||||||||||||
1621 | /*! | - | ||||||||||||||||||
1622 | \reimp | - | ||||||||||||||||||
1623 | */ | - | ||||||||||||||||||
1624 | bool QAbstractItemView::focusNextPrevChild(bool next) | - | ||||||||||||||||||
1625 | { | - | ||||||||||||||||||
1626 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1627 | if (d->tabKeyNavigation && isEnabled() && d->viewport->isEnabled()) {
| 0 | ||||||||||||||||||
1628 | QKeyEvent event(QEvent::KeyPress, next ? Qt::Key_Tab : Qt::Key_Backtab, Qt::NoModifier); | - | ||||||||||||||||||
1629 | keyPressEvent(&event); | - | ||||||||||||||||||
1630 | if (event.isAccepted())
| 0 | ||||||||||||||||||
1631 | return true; never executed: return true; | 0 | ||||||||||||||||||
1632 | } never executed: end of block | 0 | ||||||||||||||||||
1633 | return QAbstractScrollArea::focusNextPrevChild(next); never executed: return QAbstractScrollArea::focusNextPrevChild(next); | 0 | ||||||||||||||||||
1634 | } | - | ||||||||||||||||||
1635 | - | |||||||||||||||||||
1636 | /*! | - | ||||||||||||||||||
1637 | \reimp | - | ||||||||||||||||||
1638 | */ | - | ||||||||||||||||||
1639 | bool QAbstractItemView::event(QEvent *event) | - | ||||||||||||||||||
1640 | { | - | ||||||||||||||||||
1641 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1642 | switch (event->type()) { | - | ||||||||||||||||||
1643 | case QEvent::Paint: never executed: case QEvent::Paint: | 0 | ||||||||||||||||||
1644 | //we call this here because the scrollbars' visibility might be altered | - | ||||||||||||||||||
1645 | //so this can't be done in the paintEvent method | - | ||||||||||||||||||
1646 | d->executePostedLayout(); //make sure we set the layout properly | - | ||||||||||||||||||
1647 | break; never executed: break; | 0 | ||||||||||||||||||
1648 | case QEvent::Show: never executed: case QEvent::Show: | 0 | ||||||||||||||||||
1649 | d->executePostedLayout(); //make sure we set the layout properly | - | ||||||||||||||||||
1650 | if (d->shouldScrollToCurrentOnShow) {
| 0 | ||||||||||||||||||
1651 | d->shouldScrollToCurrentOnShow = false; | - | ||||||||||||||||||
1652 | const QModelIndex current = currentIndex(); | - | ||||||||||||||||||
1653 | if (current.isValid() && (d->state == QAbstractItemView::EditingState || d->autoScroll))
| 0 | ||||||||||||||||||
1654 | scrollTo(current); never executed: scrollTo(current); | 0 | ||||||||||||||||||
1655 | } never executed: end of block | 0 | ||||||||||||||||||
1656 | break; never executed: break; | 0 | ||||||||||||||||||
1657 | case QEvent::LocaleChange: never executed: case QEvent::LocaleChange: | 0 | ||||||||||||||||||
1658 | viewport()->update(); | - | ||||||||||||||||||
1659 | break; never executed: break; | 0 | ||||||||||||||||||
1660 | case QEvent::LayoutDirectionChange: never executed: case QEvent::LayoutDirectionChange: | 0 | ||||||||||||||||||
1661 | case QEvent::ApplicationLayoutDirectionChange: never executed: case QEvent::ApplicationLayoutDirectionChange: | 0 | ||||||||||||||||||
1662 | updateGeometries(); | - | ||||||||||||||||||
1663 | break; never executed: break; | 0 | ||||||||||||||||||
1664 | case QEvent::StyleChange: never executed: case QEvent::StyleChange: | 0 | ||||||||||||||||||
1665 | doItemsLayout(); | - | ||||||||||||||||||
1666 | if (!d->verticalScrollModeSet)
| 0 | ||||||||||||||||||
1667 | resetVerticalScrollMode(); never executed: resetVerticalScrollMode(); | 0 | ||||||||||||||||||
1668 | if (!d->horizontalScrollModeSet)
| 0 | ||||||||||||||||||
1669 | resetHorizontalScrollMode(); never executed: resetHorizontalScrollMode(); | 0 | ||||||||||||||||||
1670 | break; never executed: break; | 0 | ||||||||||||||||||
1671 | case QEvent::FocusOut: never executed: case QEvent::FocusOut: | 0 | ||||||||||||||||||
1672 | d->checkPersistentEditorFocus(); | - | ||||||||||||||||||
1673 | break; never executed: break; | 0 | ||||||||||||||||||
1674 | case QEvent::FontChange: never executed: case QEvent::FontChange: | 0 | ||||||||||||||||||
1675 | d->doDelayedItemsLayout(); // the size of the items will change | - | ||||||||||||||||||
1676 | break; never executed: break; | 0 | ||||||||||||||||||
1677 | default: never executed: default: | 0 | ||||||||||||||||||
1678 | break; never executed: break; | 0 | ||||||||||||||||||
1679 | } | - | ||||||||||||||||||
1680 | return QAbstractScrollArea::event(event); never executed: return QAbstractScrollArea::event(event); | 0 | ||||||||||||||||||
1681 | } | - | ||||||||||||||||||
1682 | - | |||||||||||||||||||
1683 | /*! | - | ||||||||||||||||||
1684 | \fn bool QAbstractItemView::viewportEvent(QEvent *event) | - | ||||||||||||||||||
1685 | - | |||||||||||||||||||
1686 | This function is used to handle tool tips, and What's | - | ||||||||||||||||||
1687 | This? mode, if the given \a event is a QEvent::ToolTip,or a | - | ||||||||||||||||||
1688 | QEvent::WhatsThis. It passes all other | - | ||||||||||||||||||
1689 | events on to its base class viewportEvent() handler. | - | ||||||||||||||||||
1690 | */ | - | ||||||||||||||||||
1691 | bool QAbstractItemView::viewportEvent(QEvent *event) | - | ||||||||||||||||||
1692 | { | - | ||||||||||||||||||
1693 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1694 | switch (event->type()) { | - | ||||||||||||||||||
1695 | case QEvent::HoverMove: never executed: case QEvent::HoverMove: | 0 | ||||||||||||||||||
1696 | case QEvent::HoverEnter: never executed: case QEvent::HoverEnter: | 0 | ||||||||||||||||||
1697 | d->setHoverIndex(indexAt(static_cast<QHoverEvent*>(event)->pos())); | - | ||||||||||||||||||
1698 | break; never executed: break; | 0 | ||||||||||||||||||
1699 | case QEvent::HoverLeave: never executed: case QEvent::HoverLeave: | 0 | ||||||||||||||||||
1700 | d->setHoverIndex(QModelIndex()); | - | ||||||||||||||||||
1701 | break; never executed: break; | 0 | ||||||||||||||||||
1702 | case QEvent::Enter: never executed: case QEvent::Enter: | 0 | ||||||||||||||||||
1703 | d->viewportEnteredNeeded = true; | - | ||||||||||||||||||
1704 | break; never executed: break; | 0 | ||||||||||||||||||
1705 | case QEvent::Leave: never executed: case QEvent::Leave: | 0 | ||||||||||||||||||
1706 | #ifndef QT_NO_STATUSTIP | - | ||||||||||||||||||
1707 | if (d->shouldClearStatusTip && d->parent) {
| 0 | ||||||||||||||||||
1708 | QString empty; | - | ||||||||||||||||||
1709 | QStatusTipEvent tip(empty); | - | ||||||||||||||||||
1710 | QApplication::sendEvent(d->parent, &tip); | - | ||||||||||||||||||
1711 | d->shouldClearStatusTip = false; | - | ||||||||||||||||||
1712 | } never executed: end of block | 0 | ||||||||||||||||||
1713 | #endif | - | ||||||||||||||||||
1714 | d->enteredIndex = QModelIndex(); | - | ||||||||||||||||||
1715 | break; never executed: break; | 0 | ||||||||||||||||||
1716 | case QEvent::ToolTip: never executed: case QEvent::ToolTip: | 0 | ||||||||||||||||||
1717 | case QEvent::QueryWhatsThis: never executed: case QEvent::QueryWhatsThis: | 0 | ||||||||||||||||||
1718 | case QEvent::WhatsThis: { never executed: case QEvent::WhatsThis: | 0 | ||||||||||||||||||
1719 | QHelpEvent *he = static_cast<QHelpEvent*>(event); | - | ||||||||||||||||||
1720 | const QModelIndex index = indexAt(he->pos()); | - | ||||||||||||||||||
1721 | QStyleOptionViewItem option = d->viewOptionsV1(); | - | ||||||||||||||||||
1722 | option.rect = visualRect(index); | - | ||||||||||||||||||
1723 | option.state |= (index == currentIndex() ? QStyle::State_HasFocus : QStyle::State_None);
| 0 | ||||||||||||||||||
1724 | - | |||||||||||||||||||
1725 | QAbstractItemDelegate *delegate = d->delegateForIndex(index); | - | ||||||||||||||||||
1726 | if (!delegate)
| 0 | ||||||||||||||||||
1727 | return false; never executed: return false; | 0 | ||||||||||||||||||
1728 | return delegate->helpEvent(he, this, option, index); never executed: return delegate->helpEvent(he, this, option, index); | 0 | ||||||||||||||||||
1729 | } | - | ||||||||||||||||||
1730 | case QEvent::FontChange: never executed: case QEvent::FontChange: | 0 | ||||||||||||||||||
1731 | d->doDelayedItemsLayout(); // the size of the items will change | - | ||||||||||||||||||
1732 | break; never executed: break; | 0 | ||||||||||||||||||
1733 | case QEvent::WindowActivate: never executed: case QEvent::WindowActivate: | 0 | ||||||||||||||||||
1734 | case QEvent::WindowDeactivate: never executed: case QEvent::WindowDeactivate: | 0 | ||||||||||||||||||
1735 | d->viewport->update(); | - | ||||||||||||||||||
1736 | break; never executed: break; | 0 | ||||||||||||||||||
1737 | case QEvent::ScrollPrepare: never executed: case QEvent::ScrollPrepare: | 0 | ||||||||||||||||||
1738 | executeDelayedItemsLayout(); | - | ||||||||||||||||||
1739 | #ifndef QT_NO_GESTURES | - | ||||||||||||||||||
1740 | connect(QScroller::scroller(d->viewport), SIGNAL(stateChanged(QScroller::State)), this, SLOT(_q_scrollerStateChanged()), Qt::UniqueConnection); | - | ||||||||||||||||||
1741 | #endif | - | ||||||||||||||||||
1742 | break; never executed: break; | 0 | ||||||||||||||||||
1743 | - | |||||||||||||||||||
1744 | default: never executed: default: | 0 | ||||||||||||||||||
1745 | break; never executed: break; | 0 | ||||||||||||||||||
1746 | } | - | ||||||||||||||||||
1747 | return QAbstractScrollArea::viewportEvent(event); never executed: return QAbstractScrollArea::viewportEvent(event); | 0 | ||||||||||||||||||
1748 | } | - | ||||||||||||||||||
1749 | - | |||||||||||||||||||
1750 | /*! | - | ||||||||||||||||||
1751 | This function is called with the given \a event when a mouse button is pressed | - | ||||||||||||||||||
1752 | while the cursor is inside the widget. If a valid item is pressed on it is made | - | ||||||||||||||||||
1753 | into the current item. This function emits the pressed() signal. | - | ||||||||||||||||||
1754 | */ | - | ||||||||||||||||||
1755 | void QAbstractItemView::mousePressEvent(QMouseEvent *event) | - | ||||||||||||||||||
1756 | { | - | ||||||||||||||||||
1757 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1758 | d->delayedAutoScroll.stop(); //any interaction with the view cancel the auto scrolling | - | ||||||||||||||||||
1759 | QPoint pos = event->pos(); | - | ||||||||||||||||||
1760 | QPersistentModelIndex index = indexAt(pos); | - | ||||||||||||||||||
1761 | - | |||||||||||||||||||
1762 | if (!d->selectionModel
| 0 | ||||||||||||||||||
1763 | || (d->state == EditingState && d->hasEditor(index)))
| 0 | ||||||||||||||||||
1764 | return; never executed: return; | 0 | ||||||||||||||||||
1765 | - | |||||||||||||||||||
1766 | d->pressedAlreadySelected = d->selectionModel->isSelected(index); | - | ||||||||||||||||||
1767 | d->pressedIndex = index; | - | ||||||||||||||||||
1768 | d->pressedModifiers = event->modifiers(); | - | ||||||||||||||||||
1769 | QItemSelectionModel::SelectionFlags command = selectionCommand(index, event); | - | ||||||||||||||||||
1770 | d->noSelectionOnMousePress = command == QItemSelectionModel::NoUpdate || !index.isValid();
| 0 | ||||||||||||||||||
1771 | QPoint offset = d->offset(); | - | ||||||||||||||||||
1772 | if ((command & QItemSelectionModel::Current) == 0) {
| 0 | ||||||||||||||||||
1773 | d->pressedPosition = pos + offset; | - | ||||||||||||||||||
1774 | d->currentSelectionStartIndex = index; | - | ||||||||||||||||||
1775 | } never executed: end of block | 0 | ||||||||||||||||||
1776 | else if (!d->currentSelectionStartIndex.isValid())
| 0 | ||||||||||||||||||
1777 | d->currentSelectionStartIndex = currentIndex(); never executed: d->currentSelectionStartIndex = currentIndex(); | 0 | ||||||||||||||||||
1778 | - | |||||||||||||||||||
1779 | if (edit(index, NoEditTriggers, event))
| 0 | ||||||||||||||||||
1780 | return; never executed: return; | 0 | ||||||||||||||||||
1781 | - | |||||||||||||||||||
1782 | if (index.isValid() && d->isIndexEnabled(index)) {
| 0 | ||||||||||||||||||
1783 | // we disable scrollTo for mouse press so the item doesn't change position | - | ||||||||||||||||||
1784 | // when the user is interacting with it (ie. clicking on it) | - | ||||||||||||||||||
1785 | bool autoScroll = d->autoScroll; | - | ||||||||||||||||||
1786 | d->autoScroll = false; | - | ||||||||||||||||||
1787 | d->selectionModel->setCurrentIndex(index, QItemSelectionModel::NoUpdate); | - | ||||||||||||||||||
1788 | d->autoScroll = autoScroll; | - | ||||||||||||||||||
1789 | if (command.testFlag(QItemSelectionModel::Toggle)) {
| 0 | ||||||||||||||||||
1790 | command &= ~QItemSelectionModel::Toggle; | - | ||||||||||||||||||
1791 | d->ctrlDragSelectionFlag = d->selectionModel->isSelected(index) ? QItemSelectionModel::Deselect : QItemSelectionModel::Select;
| 0 | ||||||||||||||||||
1792 | command |= d->ctrlDragSelectionFlag; | - | ||||||||||||||||||
1793 | } never executed: end of block | 0 | ||||||||||||||||||
1794 | - | |||||||||||||||||||
1795 | if ((command & QItemSelectionModel::Current) == 0) {
| 0 | ||||||||||||||||||
1796 | setSelection(QRect(pos, QSize(1, 1)), command); | - | ||||||||||||||||||
1797 | } else { never executed: end of block | 0 | ||||||||||||||||||
1798 | QRect rect(visualRect(d->currentSelectionStartIndex).center(), pos); | - | ||||||||||||||||||
1799 | setSelection(rect, command); | - | ||||||||||||||||||
1800 | } never executed: end of block | 0 | ||||||||||||||||||
1801 | - | |||||||||||||||||||
1802 | // signal handlers may change the model | - | ||||||||||||||||||
1803 | emit pressed(index); | - | ||||||||||||||||||
1804 | if (d->autoScroll) {
| 0 | ||||||||||||||||||
1805 | //we delay the autoscrolling to filter out double click event | - | ||||||||||||||||||
1806 | //100 is to be sure that there won't be a double-click misinterpreted as a 2 single clicks | - | ||||||||||||||||||
1807 | d->delayedAutoScroll.start(QApplication::doubleClickInterval()+100, this); | - | ||||||||||||||||||
1808 | } never executed: end of block | 0 | ||||||||||||||||||
1809 | - | |||||||||||||||||||
1810 | } else { never executed: end of block | 0 | ||||||||||||||||||
1811 | // Forces a finalize() even if mouse is pressed, but not on a item | - | ||||||||||||||||||
1812 | d->selectionModel->select(QModelIndex(), QItemSelectionModel::Select); | - | ||||||||||||||||||
1813 | } never executed: end of block | 0 | ||||||||||||||||||
1814 | } | - | ||||||||||||||||||
1815 | - | |||||||||||||||||||
1816 | /*! | - | ||||||||||||||||||
1817 | This function is called with the given \a event when a mouse move event is | - | ||||||||||||||||||
1818 | sent to the widget. If a selection is in progress and new items are moved | - | ||||||||||||||||||
1819 | over the selection is extended; if a drag is in progress it is continued. | - | ||||||||||||||||||
1820 | */ | - | ||||||||||||||||||
1821 | void QAbstractItemView::mouseMoveEvent(QMouseEvent *event) | - | ||||||||||||||||||
1822 | { | - | ||||||||||||||||||
1823 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1824 | QPoint topLeft; | - | ||||||||||||||||||
1825 | QPoint bottomRight = event->pos(); | - | ||||||||||||||||||
1826 | - | |||||||||||||||||||
1827 | if (state() == ExpandingState || state() == CollapsingState)
| 0 | ||||||||||||||||||
1828 | return; never executed: return; | 0 | ||||||||||||||||||
1829 | - | |||||||||||||||||||
1830 | #ifndef QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1831 | if (state() == DraggingState) {
| 0 | ||||||||||||||||||
1832 | topLeft = d->pressedPosition - d->offset(); | - | ||||||||||||||||||
1833 | if ((topLeft - bottomRight).manhattanLength() > QApplication::startDragDistance()) {
| 0 | ||||||||||||||||||
1834 | d->pressedIndex = QModelIndex(); | - | ||||||||||||||||||
1835 | startDrag(d->model->supportedDragActions()); | - | ||||||||||||||||||
1836 | setState(NoState); // the startDrag will return when the dnd operation is done | - | ||||||||||||||||||
1837 | stopAutoScroll(); | - | ||||||||||||||||||
1838 | } never executed: end of block | 0 | ||||||||||||||||||
1839 | return; never executed: return; | 0 | ||||||||||||||||||
1840 | } | - | ||||||||||||||||||
1841 | #endif // QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1842 | - | |||||||||||||||||||
1843 | QPersistentModelIndex index = indexAt(bottomRight); | - | ||||||||||||||||||
1844 | QModelIndex buddy = d->model->buddy(d->pressedIndex); | - | ||||||||||||||||||
1845 | if ((state() == EditingState && d->hasEditor(buddy))
| 0 | ||||||||||||||||||
1846 | || edit(index, NoEditTriggers, event))
| 0 | ||||||||||||||||||
1847 | return; never executed: return; | 0 | ||||||||||||||||||
1848 | - | |||||||||||||||||||
1849 | if (d->selectionMode != SingleSelection)
| 0 | ||||||||||||||||||
1850 | topLeft = d->pressedPosition - d->offset(); never executed: topLeft = d->pressedPosition - d->offset(); | 0 | ||||||||||||||||||
1851 | else | - | ||||||||||||||||||
1852 | topLeft = bottomRight; never executed: topLeft = bottomRight; | 0 | ||||||||||||||||||
1853 | - | |||||||||||||||||||
1854 | d->checkMouseMove(index); | - | ||||||||||||||||||
1855 | - | |||||||||||||||||||
1856 | #ifndef QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1857 | if (d->pressedIndex.isValid()
| 0 | ||||||||||||||||||
1858 | && d->dragEnabled
| 0 | ||||||||||||||||||
1859 | && (state() != DragSelectingState)
| 0 | ||||||||||||||||||
1860 | && (event->buttons() != Qt::NoButton)
| 0 | ||||||||||||||||||
1861 | && !d->selectedDraggableIndexes().isEmpty()) {
| 0 | ||||||||||||||||||
1862 | setState(DraggingState); | - | ||||||||||||||||||
1863 | return; never executed: return; | 0 | ||||||||||||||||||
1864 | } | - | ||||||||||||||||||
1865 | #endif | - | ||||||||||||||||||
1866 | - | |||||||||||||||||||
1867 | if ((event->buttons() & Qt::LeftButton) && d->selectionAllowed(index) && d->selectionModel) {
| 0 | ||||||||||||||||||
1868 | setState(DragSelectingState); | - | ||||||||||||||||||
1869 | QItemSelectionModel::SelectionFlags command = selectionCommand(index, event); | - | ||||||||||||||||||
1870 | if (d->ctrlDragSelectionFlag != QItemSelectionModel::NoUpdate && command.testFlag(QItemSelectionModel::Toggle)) {
| 0 | ||||||||||||||||||
1871 | command &= ~QItemSelectionModel::Toggle; | - | ||||||||||||||||||
1872 | command |= d->ctrlDragSelectionFlag; | - | ||||||||||||||||||
1873 | } never executed: end of block | 0 | ||||||||||||||||||
1874 | - | |||||||||||||||||||
1875 | // Do the normalize ourselves, since QRect::normalized() is flawed | - | ||||||||||||||||||
1876 | QRect selectionRect = QRect(topLeft, bottomRight); | - | ||||||||||||||||||
1877 | setSelection(selectionRect, command); | - | ||||||||||||||||||
1878 | - | |||||||||||||||||||
1879 | // set at the end because it might scroll the view | - | ||||||||||||||||||
1880 | if (index.isValid()
| 0 | ||||||||||||||||||
1881 | && (index != d->selectionModel->currentIndex())
| 0 | ||||||||||||||||||
1882 | && d->isIndexEnabled(index))
| 0 | ||||||||||||||||||
1883 | d->selectionModel->setCurrentIndex(index, QItemSelectionModel::NoUpdate); never executed: d->selectionModel->setCurrentIndex(index, QItemSelectionModel::NoUpdate); | 0 | ||||||||||||||||||
1884 | } never executed: end of block | 0 | ||||||||||||||||||
1885 | } never executed: end of block | 0 | ||||||||||||||||||
1886 | - | |||||||||||||||||||
1887 | /*! | - | ||||||||||||||||||
1888 | This function is called with the given \a event when a mouse button is released, | - | ||||||||||||||||||
1889 | after a mouse press event on the widget. If a user presses the mouse inside your | - | ||||||||||||||||||
1890 | widget and then drags the mouse to another location before releasing the mouse button, | - | ||||||||||||||||||
1891 | your widget receives the release event. The function will emit the clicked() signal if an | - | ||||||||||||||||||
1892 | item was being pressed. | - | ||||||||||||||||||
1893 | */ | - | ||||||||||||||||||
1894 | void QAbstractItemView::mouseReleaseEvent(QMouseEvent *event) | - | ||||||||||||||||||
1895 | { | - | ||||||||||||||||||
1896 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1897 | - | |||||||||||||||||||
1898 | QPoint pos = event->pos(); | - | ||||||||||||||||||
1899 | QPersistentModelIndex index = indexAt(pos); | - | ||||||||||||||||||
1900 | - | |||||||||||||||||||
1901 | if (state() == EditingState) {
| 0 | ||||||||||||||||||
1902 | if (d->isIndexValid(index)
| 0 | ||||||||||||||||||
1903 | && d->isIndexEnabled(index)
| 0 | ||||||||||||||||||
1904 | && d->sendDelegateEvent(index, event))
| 0 | ||||||||||||||||||
1905 | update(index); never executed: update(index); | 0 | ||||||||||||||||||
1906 | return; never executed: return; | 0 | ||||||||||||||||||
1907 | } | - | ||||||||||||||||||
1908 | - | |||||||||||||||||||
1909 | bool click = (index == d->pressedIndex && index.isValid());
| 0 | ||||||||||||||||||
1910 | bool selectedClicked = click && (event->button() == Qt::LeftButton) && d->pressedAlreadySelected;
| 0 | ||||||||||||||||||
1911 | EditTrigger trigger = (selectedClicked ? SelectedClicked : NoEditTriggers);
| 0 | ||||||||||||||||||
1912 | bool edited = edit(index, trigger, event); | - | ||||||||||||||||||
1913 | - | |||||||||||||||||||
1914 | d->ctrlDragSelectionFlag = QItemSelectionModel::NoUpdate; | - | ||||||||||||||||||
1915 | - | |||||||||||||||||||
1916 | if (d->selectionModel && d->noSelectionOnMousePress) {
| 0 | ||||||||||||||||||
1917 | d->noSelectionOnMousePress = false; | - | ||||||||||||||||||
1918 | d->selectionModel->select(index, selectionCommand(index, event)); | - | ||||||||||||||||||
1919 | } never executed: end of block | 0 | ||||||||||||||||||
1920 | - | |||||||||||||||||||
1921 | setState(NoState); | - | ||||||||||||||||||
1922 | - | |||||||||||||||||||
1923 | if (click) {
| 0 | ||||||||||||||||||
1924 | if (event->button() == Qt::LeftButton)
| 0 | ||||||||||||||||||
1925 | emit clicked(index); never executed: clicked(index); | 0 | ||||||||||||||||||
1926 | if (edited)
| 0 | ||||||||||||||||||
1927 | return; never executed: return; | 0 | ||||||||||||||||||
1928 | QStyleOptionViewItem option = d->viewOptionsV1(); | - | ||||||||||||||||||
1929 | if (d->pressedAlreadySelected)
| 0 | ||||||||||||||||||
1930 | option.state |= QStyle::State_Selected; never executed: option.state |= QStyle::State_Selected; | 0 | ||||||||||||||||||
1931 | if ((model()->flags(index) & Qt::ItemIsEnabled)
| 0 | ||||||||||||||||||
1932 | && style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, &option, this))
| 0 | ||||||||||||||||||
1933 | emit activated(index); never executed: activated(index); | 0 | ||||||||||||||||||
1934 | } never executed: end of block | 0 | ||||||||||||||||||
1935 | } never executed: end of block | 0 | ||||||||||||||||||
1936 | - | |||||||||||||||||||
1937 | /*! | - | ||||||||||||||||||
1938 | This function is called with the given \a event when a mouse button is | - | ||||||||||||||||||
1939 | double clicked inside the widget. If the double-click is on a valid item it | - | ||||||||||||||||||
1940 | emits the doubleClicked() signal and calls edit() on the item. | - | ||||||||||||||||||
1941 | */ | - | ||||||||||||||||||
1942 | void QAbstractItemView::mouseDoubleClickEvent(QMouseEvent *event) | - | ||||||||||||||||||
1943 | { | - | ||||||||||||||||||
1944 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1945 | - | |||||||||||||||||||
1946 | QModelIndex index = indexAt(event->pos()); | - | ||||||||||||||||||
1947 | if (!index.isValid()
| 0 | ||||||||||||||||||
1948 | || !d->isIndexEnabled(index)
| 0 | ||||||||||||||||||
1949 | || (d->pressedIndex != index)) {
| 0 | ||||||||||||||||||
1950 | QMouseEvent me(QEvent::MouseButtonPress, | - | ||||||||||||||||||
1951 | event->localPos(), event->windowPos(), event->screenPos(), | - | ||||||||||||||||||
1952 | event->button(), event->buttons(), event->modifiers(), event->source()); | - | ||||||||||||||||||
1953 | mousePressEvent(&me); | - | ||||||||||||||||||
1954 | return; never executed: return; | 0 | ||||||||||||||||||
1955 | } | - | ||||||||||||||||||
1956 | // signal handlers may change the model | - | ||||||||||||||||||
1957 | QPersistentModelIndex persistent = index; | - | ||||||||||||||||||
1958 | emit doubleClicked(persistent); | - | ||||||||||||||||||
1959 | if ((event->button() == Qt::LeftButton) && !edit(persistent, DoubleClicked, event)
| 0 | ||||||||||||||||||
1960 | && !style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, 0, this))
| 0 | ||||||||||||||||||
1961 | emit activated(persistent); never executed: activated(persistent); | 0 | ||||||||||||||||||
1962 | } never executed: end of block | 0 | ||||||||||||||||||
1963 | - | |||||||||||||||||||
1964 | #ifndef QT_NO_DRAGANDDROP | - | ||||||||||||||||||
1965 | - | |||||||||||||||||||
1966 | /*! | - | ||||||||||||||||||
1967 | This function is called with the given \a event when a drag and drop operation enters | - | ||||||||||||||||||
1968 | the widget. If the drag is over a valid dropping place (e.g. over an item that | - | ||||||||||||||||||
1969 | accepts drops), the event is accepted; otherwise it is ignored. | - | ||||||||||||||||||
1970 | - | |||||||||||||||||||
1971 | \sa dropEvent(), startDrag() | - | ||||||||||||||||||
1972 | */ | - | ||||||||||||||||||
1973 | void QAbstractItemView::dragEnterEvent(QDragEnterEvent *event) | - | ||||||||||||||||||
1974 | { | - | ||||||||||||||||||
1975 | if (dragDropMode() == InternalMove
| 0 | ||||||||||||||||||
1976 | && (event->source() != this|| !(event->possibleActions() & Qt::MoveAction)))
| 0 | ||||||||||||||||||
1977 | return; never executed: return; | 0 | ||||||||||||||||||
1978 | - | |||||||||||||||||||
1979 | if (d_func()->canDrop(event)) {
| 0 | ||||||||||||||||||
1980 | event->accept(); | - | ||||||||||||||||||
1981 | setState(DraggingState); | - | ||||||||||||||||||
1982 | } else { never executed: end of block | 0 | ||||||||||||||||||
1983 | event->ignore(); | - | ||||||||||||||||||
1984 | } never executed: end of block | 0 | ||||||||||||||||||
1985 | } | - | ||||||||||||||||||
1986 | - | |||||||||||||||||||
1987 | /*! | - | ||||||||||||||||||
1988 | This function is called continuously with the given \a event during a drag and | - | ||||||||||||||||||
1989 | drop operation over the widget. It can cause the view to scroll if, for example, | - | ||||||||||||||||||
1990 | the user drags a selection to view's right or bottom edge. In this case, the | - | ||||||||||||||||||
1991 | event will be accepted; otherwise it will be ignored. | - | ||||||||||||||||||
1992 | - | |||||||||||||||||||
1993 | \sa dropEvent(), startDrag() | - | ||||||||||||||||||
1994 | */ | - | ||||||||||||||||||
1995 | void QAbstractItemView::dragMoveEvent(QDragMoveEvent *event) | - | ||||||||||||||||||
1996 | { | - | ||||||||||||||||||
1997 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
1998 | if (dragDropMode() == InternalMove
| 0 | ||||||||||||||||||
1999 | && (event->source() != this || !(event->possibleActions() & Qt::MoveAction)))
| 0 | ||||||||||||||||||
2000 | return; never executed: return; | 0 | ||||||||||||||||||
2001 | - | |||||||||||||||||||
2002 | // ignore by default | - | ||||||||||||||||||
2003 | event->ignore(); | - | ||||||||||||||||||
2004 | - | |||||||||||||||||||
2005 | QModelIndex index = indexAt(event->pos()); | - | ||||||||||||||||||
2006 | d->hover = index; | - | ||||||||||||||||||
2007 | if (!d->droppingOnItself(event, index)
| 0 | ||||||||||||||||||
2008 | && d->canDrop(event)) {
| 0 | ||||||||||||||||||
2009 | - | |||||||||||||||||||
2010 | if (index.isValid() && d->showDropIndicator) {
| 0 | ||||||||||||||||||
2011 | QRect rect = visualRect(index); | - | ||||||||||||||||||
2012 | d->dropIndicatorPosition = d->position(event->pos(), rect, index); | - | ||||||||||||||||||
2013 | switch (d->dropIndicatorPosition) { | - | ||||||||||||||||||
2014 | case AboveItem: never executed: case AboveItem: | 0 | ||||||||||||||||||
2015 | if (d->isIndexDropEnabled(index.parent())) {
| 0 | ||||||||||||||||||
2016 | d->dropIndicatorRect = QRect(rect.left(), rect.top(), rect.width(), 0); | - | ||||||||||||||||||
2017 | event->acceptProposedAction(); | - | ||||||||||||||||||
2018 | } else { never executed: end of block | 0 | ||||||||||||||||||
2019 | d->dropIndicatorRect = QRect(); | - | ||||||||||||||||||
2020 | } never executed: end of block | 0 | ||||||||||||||||||
2021 | break; never executed: break; | 0 | ||||||||||||||||||
2022 | case BelowItem: never executed: case BelowItem: | 0 | ||||||||||||||||||
2023 | if (d->isIndexDropEnabled(index.parent())) {
| 0 | ||||||||||||||||||
2024 | d->dropIndicatorRect = QRect(rect.left(), rect.bottom(), rect.width(), 0); | - | ||||||||||||||||||
2025 | event->acceptProposedAction(); | - | ||||||||||||||||||
2026 | } else { never executed: end of block | 0 | ||||||||||||||||||
2027 | d->dropIndicatorRect = QRect(); | - | ||||||||||||||||||
2028 | } never executed: end of block | 0 | ||||||||||||||||||
2029 | break; never executed: break; | 0 | ||||||||||||||||||
2030 | case OnItem: never executed: case OnItem: | 0 | ||||||||||||||||||
2031 | if (d->isIndexDropEnabled(index)) {
| 0 | ||||||||||||||||||
2032 | d->dropIndicatorRect = rect; | - | ||||||||||||||||||
2033 | event->acceptProposedAction(); | - | ||||||||||||||||||
2034 | } else { never executed: end of block | 0 | ||||||||||||||||||
2035 | d->dropIndicatorRect = QRect(); | - | ||||||||||||||||||
2036 | } never executed: end of block | 0 | ||||||||||||||||||
2037 | break; never executed: break; | 0 | ||||||||||||||||||
2038 | case OnViewport: never executed: case OnViewport: | 0 | ||||||||||||||||||
2039 | d->dropIndicatorRect = QRect(); | - | ||||||||||||||||||
2040 | if (d->isIndexDropEnabled(rootIndex())) {
| 0 | ||||||||||||||||||
2041 | event->acceptProposedAction(); // allow dropping in empty areas | - | ||||||||||||||||||
2042 | } never executed: end of block | 0 | ||||||||||||||||||
2043 | break; never executed: break; | 0 | ||||||||||||||||||
2044 | } | - | ||||||||||||||||||
2045 | } else { never executed: end of block | 0 | ||||||||||||||||||
2046 | d->dropIndicatorRect = QRect(); | - | ||||||||||||||||||
2047 | d->dropIndicatorPosition = OnViewport; | - | ||||||||||||||||||
2048 | if (d->isIndexDropEnabled(rootIndex())) {
| 0 | ||||||||||||||||||
2049 | event->acceptProposedAction(); // allow dropping in empty areas | - | ||||||||||||||||||
2050 | } never executed: end of block | 0 | ||||||||||||||||||
2051 | } never executed: end of block | 0 | ||||||||||||||||||
2052 | d->viewport->update(); | - | ||||||||||||||||||
2053 | } // can drop never executed: end of block | 0 | ||||||||||||||||||
2054 | - | |||||||||||||||||||
2055 | if (d->shouldAutoScroll(event->pos()))
| 0 | ||||||||||||||||||
2056 | startAutoScroll(); never executed: startAutoScroll(); | 0 | ||||||||||||||||||
2057 | } never executed: end of block | 0 | ||||||||||||||||||
2058 | - | |||||||||||||||||||
2059 | /*! | - | ||||||||||||||||||
2060 | \internal | - | ||||||||||||||||||
2061 | Return true if this is a move from ourself and \a index is a child of the selection that | - | ||||||||||||||||||
2062 | is being moved. | - | ||||||||||||||||||
2063 | */ | - | ||||||||||||||||||
2064 | bool QAbstractItemViewPrivate::droppingOnItself(QDropEvent *event, const QModelIndex &index) | - | ||||||||||||||||||
2065 | { | - | ||||||||||||||||||
2066 | Q_Q(QAbstractItemView); | - | ||||||||||||||||||
2067 | Qt::DropAction dropAction = event->dropAction(); | - | ||||||||||||||||||
2068 | if (q->dragDropMode() == QAbstractItemView::InternalMove)
| 0 | ||||||||||||||||||
2069 | dropAction = Qt::MoveAction; never executed: dropAction = Qt::MoveAction; | 0 | ||||||||||||||||||
2070 | if (event->source() == q
| 0 | ||||||||||||||||||
2071 | && event->possibleActions() & Qt::MoveAction
| 0 | ||||||||||||||||||
2072 | && dropAction == Qt::MoveAction) {
| 0 | ||||||||||||||||||
2073 | QModelIndexList selectedIndexes = q->selectedIndexes(); | - | ||||||||||||||||||
2074 | QModelIndex child = index; | - | ||||||||||||||||||
2075 | while (child.isValid() && child != root) {
| 0 | ||||||||||||||||||
2076 | if (selectedIndexes.contains(child))
| 0 | ||||||||||||||||||
2077 | return true; never executed: return true; | 0 | ||||||||||||||||||
2078 | child = child.parent(); | - | ||||||||||||||||||
2079 | } never executed: end of block | 0 | ||||||||||||||||||
2080 | } never executed: end of block | 0 | ||||||||||||||||||
2081 | return false; never executed: return false; | 0 | ||||||||||||||||||
2082 | } | - | ||||||||||||||||||
2083 | - | |||||||||||||||||||
2084 | /*! | - | ||||||||||||||||||
2085 | \fn void QAbstractItemView::dragLeaveEvent(QDragLeaveEvent *event) | - | ||||||||||||||||||
2086 | - | |||||||||||||||||||
2087 | This function is called when the item being dragged leaves the view. | - | ||||||||||||||||||
2088 | The \a event describes the state of the drag and drop operation. | - | ||||||||||||||||||
2089 | */ | - | ||||||||||||||||||
2090 | void QAbstractItemView::dragLeaveEvent(QDragLeaveEvent *) | - | ||||||||||||||||||
2091 | { | - | ||||||||||||||||||
2092 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
2093 | stopAutoScroll(); | - | ||||||||||||||||||
2094 | setState(NoState); | - | ||||||||||||||||||
2095 | d->hover = QModelIndex(); | - | ||||||||||||||||||
2096 | d->viewport->update(); | - | ||||||||||||||||||
2097 | } never executed: end of block | 0 | ||||||||||||||||||
2098 | - | |||||||||||||||||||
2099 | /*! | - | ||||||||||||||||||
2100 | This function is called with the given \a event when a drop event occurs over | - | ||||||||||||||||||
2101 | the widget. If the model accepts the even position the drop event is accepted; | - | ||||||||||||||||||
2102 | otherwise it is ignored. | - | ||||||||||||||||||
2103 | - | |||||||||||||||||||
2104 | \sa startDrag() | - | ||||||||||||||||||
2105 | */ | - | ||||||||||||||||||
2106 | void QAbstractItemView::dropEvent(QDropEvent *event) | - | ||||||||||||||||||
2107 | { | - | ||||||||||||||||||
2108 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
2109 | if (dragDropMode() == InternalMove) {
| 0 | ||||||||||||||||||
2110 | if (event->source() != this || !(event->possibleActions() & Qt::MoveAction))
| 0 | ||||||||||||||||||
2111 | return; never executed: return; | 0 | ||||||||||||||||||
2112 | } never executed: end of block | 0 | ||||||||||||||||||
2113 | - | |||||||||||||||||||
2114 | QModelIndex index; | - | ||||||||||||||||||
2115 | int col = -1; | - | ||||||||||||||||||
2116 | int row = -1; | - | ||||||||||||||||||
2117 | if (d->dropOn(event, &row, &col, &index)) {
| 0 | ||||||||||||||||||
2118 | const Qt::DropAction action = dragDropMode() == InternalMove ? Qt::MoveAction : event->dropAction();
| 0 | ||||||||||||||||||
2119 | if (d->model->dropMimeData(event->mimeData(), action, row, col, index)) {
| 0 | ||||||||||||||||||
2120 | if (action != event->dropAction()) {
| 0 | ||||||||||||||||||
2121 | event->setDropAction(action); | - | ||||||||||||||||||
2122 | event->accept(); | - | ||||||||||||||||||
2123 | } else { never executed: end of block | 0 | ||||||||||||||||||
2124 | event->acceptProposedAction(); | - | ||||||||||||||||||
2125 | } never executed: end of block | 0 | ||||||||||||||||||
2126 | } | - | ||||||||||||||||||
2127 | } never executed: end of block | 0 | ||||||||||||||||||
2128 | stopAutoScroll(); | - | ||||||||||||||||||
2129 | setState(NoState); | - | ||||||||||||||||||
2130 | d->viewport->update(); | - | ||||||||||||||||||
2131 | } never executed: end of block | 0 | ||||||||||||||||||
2132 | - | |||||||||||||||||||
2133 | /*! | - | ||||||||||||||||||
2134 | If the event hasn't already been accepted, determines the index to drop on. | - | ||||||||||||||||||
2135 | - | |||||||||||||||||||
2136 | if (row == -1 && col == -1) | - | ||||||||||||||||||
2137 | // append to this drop index | - | ||||||||||||||||||
2138 | else | - | ||||||||||||||||||
2139 | // place at row, col in drop index | - | ||||||||||||||||||
2140 | - | |||||||||||||||||||
2141 | If it returns \c true a drop can be done, and dropRow, dropCol and dropIndex reflects the position of the drop. | - | ||||||||||||||||||
2142 | \internal | - | ||||||||||||||||||
2143 | */ | - | ||||||||||||||||||
2144 | bool QAbstractItemViewPrivate::dropOn(QDropEvent *event, int *dropRow, int *dropCol, QModelIndex *dropIndex) | - | ||||||||||||||||||
2145 | { | - | ||||||||||||||||||
2146 | Q_Q(QAbstractItemView); | - | ||||||||||||||||||
2147 | if (event->isAccepted())
| 0 | ||||||||||||||||||
2148 | return false; never executed: return false; | 0 | ||||||||||||||||||
2149 | - | |||||||||||||||||||
2150 | QModelIndex index; | - | ||||||||||||||||||
2151 | // rootIndex() (i.e. the viewport) might be a valid index | - | ||||||||||||||||||
2152 | if (viewport->rect().contains(event->pos())) {
| 0 | ||||||||||||||||||
2153 | index = q->indexAt(event->pos()); | - | ||||||||||||||||||
2154 | if (!index.isValid() || !q->visualRect(index).contains(event->pos()))
| 0 | ||||||||||||||||||
2155 | index = root; never executed: index = root; | 0 | ||||||||||||||||||
2156 | } never executed: end of block | 0 | ||||||||||||||||||
2157 | - | |||||||||||||||||||
2158 | // If we are allowed to do the drop | - | ||||||||||||||||||
2159 | if (model->supportedDropActions() & event->dropAction()) {
| 0 | ||||||||||||||||||
2160 | int row = -1; | - | ||||||||||||||||||
2161 | int col = -1; | - | ||||||||||||||||||
2162 | if (index != root) {
| 0 | ||||||||||||||||||
2163 | dropIndicatorPosition = position(event->pos(), q->visualRect(index), index); | - | ||||||||||||||||||
2164 | switch (dropIndicatorPosition) { | - | ||||||||||||||||||
2165 | case QAbstractItemView::AboveItem: never executed: case QAbstractItemView::AboveItem: | 0 | ||||||||||||||||||
2166 | row = index.row(); | - | ||||||||||||||||||
2167 | col = index.column(); | - | ||||||||||||||||||
2168 | index = index.parent(); | - | ||||||||||||||||||
2169 | break; never executed: break; | 0 | ||||||||||||||||||
2170 | case QAbstractItemView::BelowItem: never executed: case QAbstractItemView::BelowItem: | 0 | ||||||||||||||||||
2171 | row = index.row() + 1; | - | ||||||||||||||||||
2172 | col = index.column(); | - | ||||||||||||||||||
2173 | index = index.parent(); | - | ||||||||||||||||||
2174 | break; never executed: break; | 0 | ||||||||||||||||||
2175 | case QAbstractItemView::OnItem: never executed: case QAbstractItemView::OnItem: | 0 | ||||||||||||||||||
2176 | case QAbstractItemView::OnViewport: never executed: case QAbstractItemView::OnViewport: | 0 | ||||||||||||||||||
2177 | break; never executed: break; | 0 | ||||||||||||||||||
2178 | } | - | ||||||||||||||||||
2179 | } else { never executed: end of block | 0 | ||||||||||||||||||
2180 | dropIndicatorPosition = QAbstractItemView::OnViewport; | - | ||||||||||||||||||
2181 | } never executed: end of block | 0 | ||||||||||||||||||
2182 | *dropIndex = index; | - | ||||||||||||||||||
2183 | *dropRow = row; | - | ||||||||||||||||||
2184 | *dropCol = col; | - | ||||||||||||||||||
2185 | if (!droppingOnItself(event, index))
| 0 | ||||||||||||||||||
2186 | return true; never executed: return true; | 0 | ||||||||||||||||||
2187 | } never executed: end of block | 0 | ||||||||||||||||||
2188 | return false; never executed: return false; | 0 | ||||||||||||||||||
2189 | } | - | ||||||||||||||||||
2190 | - | |||||||||||||||||||
2191 | QAbstractItemView::DropIndicatorPosition | - | ||||||||||||||||||
2192 | QAbstractItemViewPrivate::position(const QPoint &pos, const QRect &rect, const QModelIndex &index) const | - | ||||||||||||||||||
2193 | { | - | ||||||||||||||||||
2194 | QAbstractItemView::DropIndicatorPosition r = QAbstractItemView::OnViewport; | - | ||||||||||||||||||
2195 | if (!overwrite) {
| 0 | ||||||||||||||||||
2196 | const int margin = 2; | - | ||||||||||||||||||
2197 | if (pos.y() - rect.top() < margin) {
| 0 | ||||||||||||||||||
2198 | r = QAbstractItemView::AboveItem; | - | ||||||||||||||||||
2199 | } else if (rect.bottom() - pos.y() < margin) { never executed: end of block
| 0 | ||||||||||||||||||
2200 | r = QAbstractItemView::BelowItem; | - | ||||||||||||||||||
2201 | } else if (rect.contains(pos, true)) { never executed: end of block
| 0 | ||||||||||||||||||
2202 | r = QAbstractItemView::OnItem; | - | ||||||||||||||||||
2203 | } never executed: end of block | 0 | ||||||||||||||||||
2204 | } else { never executed: end of block | 0 | ||||||||||||||||||
2205 | QRect touchingRect = rect; | - | ||||||||||||||||||
2206 | touchingRect.adjust(-1, -1, 1, 1); | - | ||||||||||||||||||
2207 | if (touchingRect.contains(pos, false)) {
| 0 | ||||||||||||||||||
2208 | r = QAbstractItemView::OnItem; | - | ||||||||||||||||||
2209 | } never executed: end of block | 0 | ||||||||||||||||||
2210 | } never executed: end of block | 0 | ||||||||||||||||||
2211 | - | |||||||||||||||||||
2212 | if (r == QAbstractItemView::OnItem && (!(model->flags(index) & Qt::ItemIsDropEnabled)))
| 0 | ||||||||||||||||||
2213 | r = pos.y() < rect.center().y() ? QAbstractItemView::AboveItem : QAbstractItemView::BelowItem; never executed: r = pos.y() < rect.center().y() ? QAbstractItemView::AboveItem : QAbstractItemView::BelowItem;
| 0 | ||||||||||||||||||
2214 | - | |||||||||||||||||||
2215 | return r; never executed: return r; | 0 | ||||||||||||||||||
2216 | } | - | ||||||||||||||||||
2217 | - | |||||||||||||||||||
2218 | #endif // QT_NO_DRAGANDDROP | - | ||||||||||||||||||
2219 | - | |||||||||||||||||||
2220 | /*! | - | ||||||||||||||||||
2221 | This function is called with the given \a event when the widget obtains the focus. | - | ||||||||||||||||||
2222 | By default, the event is ignored. | - | ||||||||||||||||||
2223 | - | |||||||||||||||||||
2224 | \sa setFocus(), focusOutEvent() | - | ||||||||||||||||||
2225 | */ | - | ||||||||||||||||||
2226 | void QAbstractItemView::focusInEvent(QFocusEvent *event) | - | ||||||||||||||||||
2227 | { | - | ||||||||||||||||||
2228 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
2229 | QAbstractScrollArea::focusInEvent(event); | - | ||||||||||||||||||
2230 | - | |||||||||||||||||||
2231 | const QItemSelectionModel* model = selectionModel(); | - | ||||||||||||||||||
2232 | const bool currentIndexValid = currentIndex().isValid(); | - | ||||||||||||||||||
2233 | - | |||||||||||||||||||
2234 | if (model
| 0 | ||||||||||||||||||
2235 | && !d->currentIndexSet
| 0 | ||||||||||||||||||
2236 | && !currentIndexValid) {
| 0 | ||||||||||||||||||
2237 | bool autoScroll = d->autoScroll; | - | ||||||||||||||||||
2238 | d->autoScroll = false; | - | ||||||||||||||||||
2239 | QModelIndex index = moveCursor(MoveNext, Qt::NoModifier); // first visible index | - | ||||||||||||||||||
2240 | if (index.isValid() && d->isIndexEnabled(index) && event->reason() != Qt::MouseFocusReason)
| 0 | ||||||||||||||||||
2241 | selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate); never executed: selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate); | 0 | ||||||||||||||||||
2242 | d->autoScroll = autoScroll; | - | ||||||||||||||||||
2243 | } never executed: end of block | 0 | ||||||||||||||||||
2244 | - | |||||||||||||||||||
2245 | if (model && currentIndexValid) {
| 0 | ||||||||||||||||||
2246 | if (currentIndex().flags() != Qt::ItemIsEditable)
| 0 | ||||||||||||||||||
2247 | setAttribute(Qt::WA_InputMethodEnabled, false); never executed: setAttribute(Qt::WA_InputMethodEnabled, false); | 0 | ||||||||||||||||||
2248 | else | - | ||||||||||||||||||
2249 | setAttribute(Qt::WA_InputMethodEnabled); never executed: setAttribute(Qt::WA_InputMethodEnabled); | 0 | ||||||||||||||||||
2250 | } | - | ||||||||||||||||||
2251 | - | |||||||||||||||||||
2252 | if (!currentIndexValid)
| 0 | ||||||||||||||||||
2253 | setAttribute(Qt::WA_InputMethodEnabled, false); never executed: setAttribute(Qt::WA_InputMethodEnabled, false); | 0 | ||||||||||||||||||
2254 | - | |||||||||||||||||||
2255 | d->viewport->update(); | - | ||||||||||||||||||
2256 | } never executed: end of block | 0 | ||||||||||||||||||
2257 | - | |||||||||||||||||||
2258 | /*! | - | ||||||||||||||||||
2259 | This function is called with the given \a event when the widget | - | ||||||||||||||||||
2260 | looses the focus. By default, the event is ignored. | - | ||||||||||||||||||
2261 | - | |||||||||||||||||||
2262 | \sa clearFocus(), focusInEvent() | - | ||||||||||||||||||
2263 | */ | - | ||||||||||||||||||
2264 | void QAbstractItemView::focusOutEvent(QFocusEvent *event) | - | ||||||||||||||||||
2265 | { | - | ||||||||||||||||||
2266 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
2267 | QAbstractScrollArea::focusOutEvent(event); | - | ||||||||||||||||||
2268 | d->viewport->update(); | - | ||||||||||||||||||
2269 | } never executed: end of block | 0 | ||||||||||||||||||
2270 | - | |||||||||||||||||||
2271 | /*! | - | ||||||||||||||||||
2272 | This function is called with the given \a event when a key event is sent to | - | ||||||||||||||||||
2273 | the widget. The default implementation handles basic cursor movement, e.g. Up, | - | ||||||||||||||||||
2274 | Down, Left, Right, Home, PageUp, and PageDown; the activated() signal is | - | ||||||||||||||||||
2275 | emitted if the current index is valid and the activation key is pressed | - | ||||||||||||||||||
2276 | (e.g. Enter or Return, depending on the platform). | - | ||||||||||||||||||
2277 | This function is where editing is initiated by key press, e.g. if F2 is | - | ||||||||||||||||||
2278 | pressed. | - | ||||||||||||||||||
2279 | - | |||||||||||||||||||
2280 | \sa edit(), moveCursor(), keyboardSearch(), tabKeyNavigation | - | ||||||||||||||||||
2281 | */ | - | ||||||||||||||||||
2282 | void QAbstractItemView::keyPressEvent(QKeyEvent *event) | - | ||||||||||||||||||
2283 | { | - | ||||||||||||||||||
2284 | Q_D(QAbstractItemView); | - | ||||||||||||||||||
2285 | d->delayedAutoScroll.stop(); //any interaction with the view cancel the auto scrolling | - | ||||||||||||||||||
2286 | - | |||||||||||||||||||
2287 | #ifdef QT_KEYPAD_NAVIGATION | - | ||||||||||||||||||
2288 | switch (event->key()) { | - | ||||||||||||||||||
2289 | case Qt::Key_Select: | - | ||||||||||||||||||
2290 | if (QApplication::keypadNavigationEnabled()) { | - | ||||||||||||||||||
2291 | if (!hasEditFocus()) { | - | ||||||||||||||||||
2292 | setEditFocus(true); | - | ||||||||||||||||||
2293 | return; | - | ||||||||||||||||||
2294 | } | - | ||||||||||||||||||
2295 | } | - | ||||||||||||||||||
2296 | break; | - | ||||||||||||||||||
2297 | case Qt::Key_Back: | - | ||||||||||||||||||
2298 | if (QApplication::keypadNavigationEnabled() && hasEditFocus()) { | - | ||||||||||||||||||
2299 | setEditFocus(false); | - | ||||||||||||||||||
2300 | } else { | - | ||||||||||||||||||
2301 | event->ignore(); | - | ||||||||||||||||||
2302 | } | - | ||||||||||||||||||
2303 | return; | - | ||||||||||||||||||
2304 | case Qt::Key_Down: | - | ||||||||||||||||||
2305 | case Qt::Key_Up: | - | ||||||||||||||||||
2306 | // Let's ignore vertical navigation events, only if there is no other widget | - | ||||||||||||||||||
2307 | // what can take the focus in vertical direction. This means widget can handle navigation events | - | ||||||||||||||||||
2308 | // even the widget don't have edit focus, and there is no other widget in requested direction. | - | ||||||||||||||||||
2309 | if(QApplication::keypadNavigationEnabled() && !hasEditFocus() | - | ||||||||||||||||||
2310 | && QWidgetPrivate::canKeypadNavigate(Qt::Vertical)) { | - | ||||||||||||||||||
2311 | event->ignore(); | - | ||||||||||||||||||
2312 | return; | - | ||||||||||||||||||
2313 | } | - | ||||||||||||||||||
2314 | break; | - | ||||||||||||||||||
2315 | case Qt::Key_Left: | - | ||||||||||||||||||
2316 | case Qt::Key_Right: | - | ||||||||||||||||||
2317 | // Similar logic as in up and down events | - | ||||||||||||||||||
2318 | if(QApplication::keypadNavigationEnabled() && !hasEditFocus() | - | ||||||||||||||||||
2319 | && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(this))) { | - | ||||||||||||||||||
2320 | event->ignore(); | - | ||||||||||||||||||
2321 | return; | - | ||||||||||||||||||
2322 | } | - | ||||||||||||||||||
2323 | break; | - | ||||||||||||||||||
2324 | default: | - | ||||||||||||||||||
2325 | if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) { | - | ||||||||||||||||||
2326 | event->ignore(); | - | ||||||||||||||||||
2327 | return; | - | ||||||||||||||||||
2328 | } | - | ||||||||||||||||||
2329 | } | - | ||||||||||||||||||
2330 | #endif | - | ||||||||||||||||||
2331 | - | |||||||||||||||||||
2332 | #if !defined(QT_NO_CLIPBOARD) && !defined(QT_NO_SHORTCUT) | - | ||||||||||||||||||
2333 | if (event == QKeySequence::Copy) {
| 0 | ||||||||||||||||||
2334 | QVariant variant; | - | ||||||||||||||||||
2335 | if (d->model)
| 0 | ||||||||||||||||||
2336 | variant = d->model->data(currentIndex(), Qt::DisplayRole); never executed: variant = d->model->data(currentIndex(), Qt::DisplayRole); | 0 | ||||||||||||||||||
2337 | if (variant.type() == QVariant::String)
| 0 | ||||||||||||||||||
2338 | QApplication::clipboard()->setText(variant.toString()); never executed: QApplication::clipboard()->setText(variant.toString()); | 0 | ||||||||||||||||||
2339 | event->accept(); | - | ||||||||||||||||||
2340 | } never executed: end of block | 0 | ||||||||||||||||||
2341 | #endif | - | ||||||||||||||||||
2342 | - | |||||||||||||||||||
2343 | QPersistentModelIndex newCurrent; | - | ||||||||||||||||||
2344 | d->moveCursorUpdatedView = false; | - | ||||||||||||||||||
2345 | switch (event->key()) { | - | ||||||||||||||||||
2346 | case Qt::Key_Down: never executed: case Qt::Key_Down: | 0 | ||||||||||||||||||
2347 | newCurrent = moveCursor(MoveDown, event->modifiers()); | - | ||||||||||||||||||
2348 | break; never executed: break; | 0 | ||||||||||||||||||
2349 | case Qt::Key_Up: never executed: case Qt::Key_Up: | 0 | ||||||||||||||||||
2350 | newCurrent = moveCursor(MoveUp, event->modifiers()); | - | ||||||||||||||||||
2351 | break; never executed: break; | 0 | ||||||||||||||||||
2352 | case Qt::Key_Left: never executed: case Qt::Key_Left: | 0 | ||||||||||||||||||
2353 | newCurrent = moveCursor(MoveLeft, event->modifiers()); | - | ||||||||||||||||||
2354 | break; never executed: break; | 0 | ||||||||||||||||||
2355 | case Qt::Key_Right: never executed: case Qt::Key_Right: | 0 | ||||||||||||||||||
2356 | newCurrent = moveCursor(MoveRight, event->modifiers()); | - | ||||||||||||||||||
2357 | break; never executed: break; | 0 | ||||||||||||||||||
2358 | case Qt::Key_Home: never executed: case Qt::Key_Home: | 0 | ||||||||||||||||||
2359 | newCurrent = moveCursor(MoveHome, event->modifiers()); | - | ||||||||||||||||||
2360 | break; never executed: break; | 0 | ||||||||||||||||||
2361 | case Qt::Key_End: never executed: case Qt::Key_End: | 0 | ||||||||||||||||||
2362 | newCurrent = moveCursor(MoveEnd, event->modifiers()); | - | ||||||||||||||||||
2363 | break; never executed: break; | 0 | ||||||||||||||||||
2364 | case Qt::Key_PageUp: never executed: case Qt::Key_PageUp: | 0 | ||||||||||||||||||
2365 | newCurrent = moveCursor(MovePageUp, event->modifiers()); | - | ||||||||||||||||||
2366 | break; never executed: break; | 0 | ||||||||||||||||||
2367 | case Qt::Key_PageDown: never executed: case Qt::Key_PageDown: | 0 | ||||||||||||||||||
2368 | newCurrent = moveCursor(MovePageDown, event->modifiers()); | - | ||||||||||||||||||
2369 | break; never executed: break; | 0 | ||||||||||||||||||
2370 | case Qt::Key_Tab: never executed: case Qt::Key_Tab: | 0 | ||||||||||||||||||
2371 | if (d->tabKeyNavigation)
| 0 | ||||||||||||||||||
2372 | newCurrent = moveCursor(MoveNext, event->modifiers()); never executed: newCurrent = moveCursor(MoveNext, event->modifiers()); | 0 | ||||||||||||||||||
2373 | break; never executed: break; | 0 | ||||||||||||||||||
2374 | case Qt::Key_Backtab: never executed: case Qt::Key_Backtab: | 0 | ||||||||||||||||||
2375 | if (d->tabKeyNavigation)
| 0 | ||||||||||||||||||
2376 | newCurrent = moveCursor(MovePrevious, event->modifiers()); never executed: newCurrent = moveCursor(MovePrevious, event->modifiers()); | 0 | ||||||||||||||||||
2377 | break; never executed: break; | 0 | ||||||||||||||||||
2378 | } | - | ||||||||||||||||||
2379 | - | |||||||||||||||||||
2380 | QPersistentModelIndex oldCurrent = currentIndex(); | - | ||||||||||||||||||
2381 | if (newCurrent != oldCurrent && newCurrent.isValid() && d->isIndexEnabled(newCurrent)) {
| 0 | ||||||||||||||||||
2382 | if (!hasFocus() && QApplication::focusWidget() == indexWidget(oldCurrent))
| 0 | ||||||||||||||||||
2383 | setFocus(); never executed: setFocus(); | 0 | ||||||||||||||||||
2384 | QItemSelectionModel::SelectionFlags command = selectionCommand(newCurrent, event); | - | ||||||||||||||||||
2385 | if (command != QItemSelectionModel::NoUpdate
| 0 | ||||||||||||||||||
2386 | || style()->styleHint(QStyle::SH_ItemView_MovementWithoutUpdatingSelection, 0, this)) {
| 0 | ||||||||||||||||||
2387 | // note that we don't check if the new current index is enabled because moveCursor() makes sure it is | - | ||||||||||||||||||
2388 | if (command & QItemSelectionModel::Current) {
| 0 | ||||||||||||||||||
2389 | d->selectionModel->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate); | - | ||||||||||||||||||
2390 | if (!d->currentSelectionStartIndex.isValid())
|