qabstractscrollarea.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/widgets/qabstractscrollarea.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the QtWidgets module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
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 http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://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 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qabstractscrollarea.h"-
35-
36#ifndef QT_NO_SCROLLAREA-
37-
38#include "qscrollbar.h"-
39#include "qapplication.h"-
40#include "qstyle.h"-
41#include "qstyleoption.h"-
42#include "qevent.h"-
43#include "qdebug.h"-
44#include "qboxlayout.h"-
45#include "qpainter.h"-
46#include "qmargins.h"-
47#include "qheaderview.h"-
48-
49#include <QDebug>-
50-
51#include "qabstractscrollarea_p.h"-
52#include "qscrollbar_p.h"-
53#include <qwidget.h>-
54-
55#include <private/qapplication_p.h>-
56-
57#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
58#include <private/qt_mac_p.h>-
59#include <private/qt_cocoa_helpers_mac_p.h>-
60#endif-
61#ifdef Q_OS_WIN-
62# include <qlibrary.h>-
63# include <qt_windows.h>-
64#endif-
65-
66QT_BEGIN_NAMESPACE-
67-
68/*!-
69 \class QAbstractScrollArea-
70 \brief The QAbstractScrollArea widget provides a scrolling area with-
71 on-demand scroll bars.-
72-
73 \ingroup abstractwidgets-
74 \inmodule QtWidgets-
75-
76 QAbstractScrollArea is a low-level abstraction of a scrolling-
77 area. The area provides a central widget called the viewport, in-
78 which the contents of the area is to be scrolled (i.e, the-
79 visible parts of the contents are rendered in the viewport).-
80-
81 Next to the viewport is a vertical scroll bar, and below is a-
82 horizontal scroll bar. When all of the area contents fits in the-
83 viewport, each scroll bar can be either visible or hidden-
84 depending on the scroll bar's Qt::ScrollBarPolicy. When a scroll-
85 bar is hidden, the viewport expands in order to cover all-
86 available space. When a scroll bar becomes visible again, the-
87 viewport shrinks in order to make room for the scroll bar.-
88-
89 It is possible to reserve a margin area around the viewport, see-
90 setViewportMargins(). The feature is mostly used to place a-
91 QHeaderView widget above or beside the scrolling area. Subclasses-
92 of QAbstractScrollArea should implement margins.-
93-
94 When inheriting QAbstractScrollArea, you need to do the-
95 following:-
96-
97 \list-
98 \li Control the scroll bars by setting their-
99 range, value, page step, and tracking their-
100 movements.-
101 \li Draw the contents of the area in the viewport according-
102 to the values of the scroll bars.-
103 \li Handle events received by the viewport in-
104 viewportEvent() - notably resize events.-
105 \li Use \c{viewport->update()} to update the contents of the-
106 viewport instead of \l{QWidget::update()}{update()}-
107 as all painting operations take place on the viewport.-
108 \endlist-
109-
110 With a scroll bar policy of Qt::ScrollBarAsNeeded (the default),-
111 QAbstractScrollArea shows scroll bars when they provide a non-zero-
112 scrolling range, and hides them otherwise.-
113-
114 The scroll bars and viewport should be updated whenever the viewport-
115 receives a resize event or the size of the contents changes.-
116 The viewport also needs to be updated when the scroll bars-
117 values change. The initial values of the scroll bars are often-
118 set when the area receives new contents.-
119-
120 We give a simple example, in which we have implemented a scroll area-
121 that can scroll any QWidget. We make the widget a child of the-
122 viewport; this way, we do not have to calculate which part of-
123 the widget to draw but can simply move the widget with-
124 QWidget::move(). When the area contents or the viewport size-
125 changes, we do the following:-
126-
127 \snippet myscrollarea.cpp 1-
128-
129 When the scroll bars change value, we need to update the widget-
130 position, i.e., find the part of the widget that is to be drawn in-
131 the viewport:-
132-
133 \snippet myscrollarea.cpp 0-
134-
135 In order to track scroll bar movements, reimplement the virtual-
136 function scrollContentsBy(). In order to fine-tune scrolling-
137 behavior, connect to a scroll bar's-
138 QAbstractSlider::actionTriggered() signal and adjust the \l-
139 QAbstractSlider::sliderPosition as you wish.-
140-
141 For convenience, QAbstractScrollArea makes all viewport events-
142 available in the virtual viewportEvent() handler. QWidget's-
143 specialized handlers are remapped to viewport events in the cases-
144 where this makes sense. The remapped specialized handlers are:-
145 paintEvent(), mousePressEvent(), mouseReleaseEvent(),-
146 mouseDoubleClickEvent(), mouseMoveEvent(), wheelEvent(),-
147 dragEnterEvent(), dragMoveEvent(), dragLeaveEvent(), dropEvent(),-
148 contextMenuEvent(), and resizeEvent().-
149-
150 QScrollArea, which inherits QAbstractScrollArea, provides smooth-
151 scrolling for any QWidget (i.e., the widget is scrolled pixel by-
152 pixel). You only need to subclass QAbstractScrollArea if you need-
153 more specialized behavior. This is, for instance, true if the-
154 entire contents of the area is not suitable for being drawn on a-
155 QWidget or if you do not want smooth scrolling.-
156-
157 \sa QScrollArea-
158*/-
159-
160QAbstractScrollAreaPrivate::QAbstractScrollAreaPrivate()-
161 :hbar(0), vbar(0), vbarpolicy(Qt::ScrollBarAsNeeded), hbarpolicy(Qt::ScrollBarAsNeeded),-
162 shownOnce(false), inResize(false), sizeAdjustPolicy(QAbstractScrollArea::AdjustIgnored),-
163 viewport(0), cornerWidget(0), left(0), top(0), right(0), bottom(0),-
164 xoffset(0), yoffset(0), viewportFilter(0)-
165#ifdef Q_DEAD_CODE_FROM_QT4_WIN-
166 , singleFingerPanEnabled(false)-
167#endif-
168{-
169}
never executed: end of block
0
170-
171QAbstractScrollAreaPrivate::~QAbstractScrollAreaPrivate()-
172{-
173}-
174-
175QAbstractScrollAreaScrollBarContainer::QAbstractScrollAreaScrollBarContainer(Qt::Orientation orientation, QWidget *parent)-
176 :QWidget(parent), scrollBar(new QScrollBar(orientation, this)),-
177 layout(new QBoxLayout(orientation == Qt::Horizontal ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom)),-
178 orientation(orientation)-
179{-
180 setLayout(layout);-
181 layout->setMargin(0);-
182 layout->setSpacing(0);-
183 layout->addWidget(scrollBar);-
184 layout->setSizeConstraint(QLayout::SetMaximumSize);-
185}
never executed: end of block
0
186-
187/*! \internal-
188 Adds a widget to the scroll bar container.-
189*/-
190void QAbstractScrollAreaScrollBarContainer::addWidget(QWidget *widget, LogicalPosition position)-
191{-
192 QSizePolicy policy = widget->sizePolicy();-
193 if (orientation == Qt::Vertical)
orientation == Qt::VerticalDescription
TRUEnever evaluated
FALSEnever evaluated
0
194 policy.setHorizontalPolicy(QSizePolicy::Ignored);
never executed: policy.setHorizontalPolicy(QSizePolicy::Ignored);
0
195 else-
196 policy.setVerticalPolicy(QSizePolicy::Ignored);
never executed: policy.setVerticalPolicy(QSizePolicy::Ignored);
0
197 widget->setSizePolicy(policy);-
198 widget->setParent(this);-
199-
200 const int insertIndex = (position & LogicalLeft) ? 0 : scrollBarLayoutIndex() + 1;
(position & LogicalLeft)Description
TRUEnever evaluated
FALSEnever evaluated
0
201 layout->insertWidget(insertIndex, widget);-
202}
never executed: end of block
0
203-
204/*! \internal-
205 Retuns a list of scroll bar widgets for the given position. The scroll bar-
206 itself is not returned.-
207*/-
208QWidgetList QAbstractScrollAreaScrollBarContainer::widgets(LogicalPosition position)-
209{-
210 QWidgetList list;-
211 const int scrollBarIndex = scrollBarLayoutIndex();-
212 if (position == LogicalLeft) {
position == LogicalLeftDescription
TRUEnever evaluated
FALSEnever evaluated
0
213 list.reserve(scrollBarIndex);-
214 for (int i = 0; i < scrollBarIndex; ++i)
i < scrollBarIndexDescription
TRUEnever evaluated
FALSEnever evaluated
0
215 list.append(layout->itemAt(i)->widget());
never executed: list.append(layout->itemAt(i)->widget());
0
216 } else if (position == LogicalRight) {
never executed: end of block
position == LogicalRightDescription
TRUEnever evaluated
FALSEnever evaluated
0
217 const int layoutItemCount = layout->count();-
218 list.reserve(layoutItemCount - (scrollBarIndex + 1));-
219 for (int i = scrollBarIndex + 1; i < layoutItemCount; ++i)
i < layoutItemCountDescription
TRUEnever evaluated
FALSEnever evaluated
0
220 list.append(layout->itemAt(i)->widget());
never executed: list.append(layout->itemAt(i)->widget());
0
221 }
never executed: end of block
0
222 return list;
never executed: return list;
0
223}-
224-
225/*! \internal-
226 Returns the layout index for the scroll bar. This needs to be-
227 recalculated by a linear search for each use, since items in-
228 the layout can be removed at any time (i.e. when a widget is-
229 deleted or re-parented).-
230*/-
231int QAbstractScrollAreaScrollBarContainer::scrollBarLayoutIndex() const-
232{-
233 const int layoutItemCount = layout->count();-
234 for (int i = 0; i < layoutItemCount; ++i) {
i < layoutItemCountDescription
TRUEnever evaluated
FALSEnever evaluated
0
235 if (qobject_cast<QScrollBar *>(layout->itemAt(i)->widget()))
qobject_cast<Q...(i)->widget())Description
TRUEnever evaluated
FALSEnever evaluated
0
236 return i;
never executed: return i;
0
237 }
never executed: end of block
0
238 return -1;
never executed: return -1;
0
239}-
240-
241/*! \internal-
242*/-
243void QAbstractScrollAreaPrivate::replaceScrollBar(QScrollBar *scrollBar,-
244 Qt::Orientation orientation)-
245{-
246 Q_Q(QAbstractScrollArea);-
247-
248 QAbstractScrollAreaScrollBarContainer *container = scrollBarContainers[orientation];-
249 bool horizontal = (orientation == Qt::Horizontal);-
250 QScrollBar *oldBar = horizontal ? hbar : vbar;
horizontalDescription
TRUEnever evaluated
FALSEnever evaluated
0
251 if (horizontal)
horizontalDescription
TRUEnever evaluated
FALSEnever evaluated
0
252 hbar = scrollBar;
never executed: hbar = scrollBar;
0
253 else-
254 vbar = scrollBar;
never executed: vbar = scrollBar;
0
255 scrollBar->setParent(container);-
256 container->scrollBar = scrollBar;-
257 container->layout->removeWidget(oldBar);-
258 container->layout->insertWidget(0, scrollBar);-
259 scrollBar->setVisible(oldBar->isVisibleTo(container));-
260 scrollBar->setInvertedAppearance(oldBar->invertedAppearance());-
261 scrollBar->setInvertedControls(oldBar->invertedControls());-
262 scrollBar->setRange(oldBar->minimum(), oldBar->maximum());-
263 scrollBar->setOrientation(oldBar->orientation());-
264 scrollBar->setPageStep(oldBar->pageStep());-
265 scrollBar->setSingleStep(oldBar->singleStep());-
266 scrollBar->setSliderDown(oldBar->isSliderDown());-
267 scrollBar->setSliderPosition(oldBar->sliderPosition());-
268 scrollBar->setTracking(oldBar->hasTracking());-
269 scrollBar->setValue(oldBar->value());-
270 scrollBar->installEventFilter(q);-
271 oldBar->removeEventFilter(q);-
272 delete oldBar;-
273-
274 QObject::connect(scrollBar, SIGNAL(valueChanged(int)),-
275 q, horizontal ? SLOT(_q_hslide(int)) : SLOT(_q_vslide(int)));-
276 QObject::connect(scrollBar, SIGNAL(rangeChanged(int,int)),-
277 q, SLOT(_q_showOrHideScrollBars()), Qt::QueuedConnection);-
278}
never executed: end of block
0
279-
280void QAbstractScrollAreaPrivate::init()-
281{-
282 Q_Q(QAbstractScrollArea);-
283 viewport = new QWidget(q);-
284 viewport->setObjectName(QLatin1String("qt_scrollarea_viewport"));-
285 viewport->setBackgroundRole(QPalette::Base);-
286 viewport->setAutoFillBackground(true);-
287 scrollBarContainers[Qt::Horizontal] = new QAbstractScrollAreaScrollBarContainer(Qt::Horizontal, q);-
288 scrollBarContainers[Qt::Horizontal]->setObjectName(QLatin1String("qt_scrollarea_hcontainer"));-
289 hbar = scrollBarContainers[Qt::Horizontal]->scrollBar;-
290 hbar->setRange(0,0);-
291 scrollBarContainers[Qt::Horizontal]->setVisible(false);-
292 hbar->installEventFilter(q);-
293 QObject::connect(hbar, SIGNAL(valueChanged(int)), q, SLOT(_q_hslide(int)));-
294 QObject::connect(hbar, SIGNAL(rangeChanged(int,int)), q, SLOT(_q_showOrHideScrollBars()), Qt::QueuedConnection);-
295 scrollBarContainers[Qt::Vertical] = new QAbstractScrollAreaScrollBarContainer(Qt::Vertical, q);-
296 scrollBarContainers[Qt::Vertical]->setObjectName(QLatin1String("qt_scrollarea_vcontainer"));-
297 vbar = scrollBarContainers[Qt::Vertical]->scrollBar;-
298 vbar->setRange(0,0);-
299 scrollBarContainers[Qt::Vertical]->setVisible(false);-
300 vbar->installEventFilter(q);-
301 QObject::connect(vbar, SIGNAL(valueChanged(int)), q, SLOT(_q_vslide(int)));-
302 QObject::connect(vbar, SIGNAL(rangeChanged(int,int)), q, SLOT(_q_showOrHideScrollBars()), Qt::QueuedConnection);-
303 viewportFilter.reset(new QAbstractScrollAreaFilter(this));-
304 viewport->installEventFilter(viewportFilter.data());-
305 viewport->setFocusProxy(q);-
306 q->setFocusPolicy(Qt::StrongFocus);-
307 q->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);-
308 q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);-
309 layoutChildren();-
310#ifndef Q_OS_OSX-
311# ifndef QT_NO_GESTURES-
312 viewport->grabGesture(Qt::PanGesture);-
313# endif-
314#endif-
315}
never executed: end of block
0
316-
317#ifdef Q_DEAD_CODE_FROM_QT4_WIN-
318void QAbstractScrollAreaPrivate::setSingleFingerPanEnabled(bool on)-
319{-
320 singleFingerPanEnabled = on;-
321 QWidgetPrivate *dd = static_cast<QWidgetPrivate *>(QObjectPrivate::get(viewport));-
322 if (dd)-
323 dd->winSetupGestures();-
324}-
325#endif // Q_DEAD_CODE_FROM_QT4_WIN-
326-
327void QAbstractScrollAreaPrivate::layoutChildren()-
328{-
329 Q_Q(QAbstractScrollArea);-
330 bool htransient = hbar->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, hbar);-
331 bool needh = (hbarpolicy != Qt::ScrollBarAlwaysOff) && ((hbarpolicy == Qt::ScrollBarAlwaysOn && !htransient)
(hbarpolicy !=...lBarAlwaysOff)Description
TRUEnever evaluated
FALSEnever evaluated
hbarpolicy == ...ollBarAlwaysOnDescription
TRUEnever evaluated
FALSEnever evaluated
!htransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
332 || ((hbarpolicy == Qt::ScrollBarAsNeeded || htransient)
hbarpolicy == ...ollBarAsNeededDescription
TRUEnever evaluated
FALSEnever evaluated
htransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
333 && hbar->minimum() < hbar->maximum() && !hbar->sizeHint().isEmpty()));
hbar->minimum(...bar->maximum()Description
TRUEnever evaluated
FALSEnever evaluated
!hbar->sizeHint().isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
334-
335 bool vtransient = vbar->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, vbar);-
336 bool needv = (vbarpolicy != Qt::ScrollBarAlwaysOff) && ((vbarpolicy == Qt::ScrollBarAlwaysOn && !vtransient)
(vbarpolicy !=...lBarAlwaysOff)Description
TRUEnever evaluated
FALSEnever evaluated
vbarpolicy == ...ollBarAlwaysOnDescription
TRUEnever evaluated
FALSEnever evaluated
!vtransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
337 || ((vbarpolicy == Qt::ScrollBarAsNeeded || vtransient)
vbarpolicy == ...ollBarAsNeededDescription
TRUEnever evaluated
FALSEnever evaluated
vtransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
338 && vbar->minimum() < vbar->maximum() && !vbar->sizeHint().isEmpty()));
vbar->minimum(...bar->maximum()Description
TRUEnever evaluated
FALSEnever evaluated
!vbar->sizeHint().isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
339-
340 QStyleOption opt(0);-
341 opt.init(q);-
342-
343 const int hscrollOverlap = hbar->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarOverlap, &opt, hbar);-
344 const int vscrollOverlap = vbar->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarOverlap, &opt, vbar);-
345-
346#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
347 QWidget * const window = q->window();-
348-
349 // Use small scroll bars for tool windows, to match the native size grip.-
350 bool hbarIsSmall = hbar->testAttribute(Qt::WA_MacSmallSize);-
351 bool vbarIsSmall = vbar->testAttribute(Qt::WA_MacSmallSize);-
352 const Qt::WindowType windowType = window->windowType();-
353 if (windowType == Qt::Tool) {-
354 if (!hbarIsSmall) {-
355 hbar->setAttribute(Qt::WA_MacMiniSize, false);-
356 hbar->setAttribute(Qt::WA_MacNormalSize, false);-
357 hbar->setAttribute(Qt::WA_MacSmallSize, true);-
358 }-
359 if (!vbarIsSmall) {-
360 vbar->setAttribute(Qt::WA_MacMiniSize, false);-
361 vbar->setAttribute(Qt::WA_MacNormalSize, false);-
362 vbar->setAttribute(Qt::WA_MacSmallSize, true);-
363 }-
364 } else {-
365 if (hbarIsSmall) {-
366 hbar->setAttribute(Qt::WA_MacMiniSize, false);-
367 hbar->setAttribute(Qt::WA_MacNormalSize, false);-
368 hbar->setAttribute(Qt::WA_MacSmallSize, false);-
369 }-
370 if (vbarIsSmall) {-
371 vbar->setAttribute(Qt::WA_MacMiniSize, false);-
372 vbar->setAttribute(Qt::WA_MacNormalSize, false);-
373 vbar->setAttribute(Qt::WA_MacSmallSize, false);-
374 }-
375 }-
376#endif-
377-
378 const int hsbExt = hbar->sizeHint().height();-
379 const int vsbExt = vbar->sizeHint().width();-
380 const QPoint extPoint(vsbExt, hsbExt);-
381 const QSize extSize(vsbExt, hsbExt);-
382-
383 const QRect widgetRect = q->rect();-
384-
385 const bool hasCornerWidget = (cornerWidget != 0);-
386-
387// If the scroll bars are at the very right and bottom of the window we-
388// move their positions to be aligned with the size grip.-
389#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
390 // Check if a native sizegrip is present.-
391 bool hasMacReverseSizeGrip = false;-
392 bool hasMacSizeGrip = false;-
393 bool nativeGripPresent = false;-
394 if (q->testAttribute(Qt::WA_WState_Created))-
395 nativeGripPresent = qt_mac_checkForNativeSizeGrip(q);-
396-
397 if (nativeGripPresent) {-
398 // Look for a native size grip at the visual window bottom right and at the-
399 // absolute window bottom right. In reverse mode, the native size grip does not-
400 // swich side, so we need to check if it is on the "wrong side".-
401 const QPoint scrollAreaBottomRight = q->mapTo(window, widgetRect.bottomRight() - QPoint(frameWidth, frameWidth));-
402 const QPoint windowBottomRight = window->rect().bottomRight();-
403 const QPoint visualWindowBottomRight = QStyle::visualPos(opt.direction, opt.rect, windowBottomRight);-
404 const QPoint offset = windowBottomRight - scrollAreaBottomRight;-
405 const QPoint visualOffset = visualWindowBottomRight - scrollAreaBottomRight;-
406 hasMacSizeGrip = (visualOffset.manhattanLength() < vsbExt);-
407 hasMacReverseSizeGrip = (hasMacSizeGrip == false && (offset.manhattanLength() < hsbExt));-
408 }-
409#endif-
410-
411 QPoint cornerOffset((needv && vscrollOverlap == 0) ? vsbExt : 0, (needh && hscrollOverlap == 0) ? hsbExt : 0);-
412 QRect controlsRect;-
413 QRect viewportRect;-
414-
415 // In FrameOnlyAroundContents mode the frame is drawn between the controls and-
416 // the viewport, else the frame rect is equal to the widget rect.-
417 if ((frameStyle != QFrame::NoFrame) &&
(frameStyle !=...rame::NoFrame)Description
TRUEnever evaluated
FALSEnever evaluated
0
418 q->style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &opt, q)) {
q->style()->st...ents, &opt, q)Description
TRUEnever evaluated
FALSEnever evaluated
0
419 controlsRect = widgetRect;-
420 const int spacing = q->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &opt, q);-
421 const QPoint cornerExtra(needv ? spacing + vscrollOverlap : 0, needh ? spacing + hscrollOverlap : 0);-
422 QRect frameRect = widgetRect;-
423 frameRect.adjust(0, 0, -cornerOffset.x() - cornerExtra.x(), -cornerOffset.y() - cornerExtra.y());-
424 q->setFrameRect(QStyle::visualRect(opt.direction, opt.rect, frameRect));-
425 // The frame rect needs to be in logical coords, however we need to flip-
426 // the contentsRect back before passing it on to the viewportRect-
427 // since the viewportRect has its logical coords calculated later.-
428 viewportRect = QStyle::visualRect(opt.direction, opt.rect, q->contentsRect());-
429 } else {
never executed: end of block
0
430 q->setFrameRect(QStyle::visualRect(opt.direction, opt.rect, widgetRect));-
431 controlsRect = q->contentsRect();-
432 viewportRect = QRect(controlsRect.topLeft(), controlsRect.bottomRight() - cornerOffset);-
433 }
never executed: end of block
0
434-
435 cornerOffset = QPoint(needv ? vsbExt : 0, needh ? hsbExt : 0);-
436-
437 // If we have a corner widget and are only showing one scroll bar, we need to move it-
438 // to make room for the corner widget.-
439 if (hasCornerWidget && ((needv && vscrollOverlap == 0) || (needh && hscrollOverlap == 0)))
hasCornerWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
needvDescription
TRUEnever evaluated
FALSEnever evaluated
vscrollOverlap == 0Description
TRUEnever evaluated
FALSEnever evaluated
needhDescription
TRUEnever evaluated
FALSEnever evaluated
hscrollOverlap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
440 cornerOffset = extPoint;
never executed: cornerOffset = extPoint;
0
441-
442#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
443 // Also move the scroll bars if they are covered by the native Mac size grip.-
444 if (hasMacSizeGrip)-
445 cornerOffset = extPoint;-
446#endif-
447-
448 // The corner point is where the scroll bar rects, the corner widget rect and the-
449 // viewport rect meets.-
450 const QPoint cornerPoint(controlsRect.bottomRight() + QPoint(1, 1) - cornerOffset);-
451-
452 // Some styles paints the corner if both scorllbars are showing and there is-
453 // no corner widget.-
454 if (needv && needh && !hasCornerWidget && hscrollOverlap == 0 && vscrollOverlap == 0)
needvDescription
TRUEnever evaluated
FALSEnever evaluated
needhDescription
TRUEnever evaluated
FALSEnever evaluated
!hasCornerWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
hscrollOverlap == 0Description
TRUEnever evaluated
FALSEnever evaluated
vscrollOverlap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
455 cornerPaintingRect = QStyle::visualRect(opt.direction, opt.rect, QRect(cornerPoint, extSize));
never executed: cornerPaintingRect = QStyle::visualRect(opt.direction, opt.rect, QRect(cornerPoint, extSize));
0
456 else-
457 cornerPaintingRect = QRect();
never executed: cornerPaintingRect = QRect();
0
458-
459#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
460 if (hasMacReverseSizeGrip)-
461 reverseCornerPaintingRect = QRect(controlsRect.bottomRight() + QPoint(1, 1) - extPoint, extSize);-
462 else-
463 reverseCornerPaintingRect = QRect();-
464#endif-
465-
466 // move the scrollbars away from top/left headers-
467 int vHeaderRight = 0;-
468 int hHeaderBottom = 0;-
469 if ((vscrollOverlap > 0 && needv) || (hscrollOverlap > 0 && needh)) {
vscrollOverlap > 0Description
TRUEnever evaluated
FALSEnever evaluated
needvDescription
TRUEnever evaluated
FALSEnever evaluated
hscrollOverlap > 0Description
TRUEnever evaluated
FALSEnever evaluated
needhDescription
TRUEnever evaluated
FALSEnever evaluated
0
470 const QList<QHeaderView *> headers = q->findChildren<QHeaderView*>();-
471 if (headers.count() <= 2) {
headers.count() <= 2Description
TRUEnever evaluated
FALSEnever evaluated
0
472 Q_FOREACH (const QHeaderView *header, headers) {-
473 const QRect geo = header->geometry();-
474 if (header->orientation() == Qt::Vertical && header->isVisible() && QStyle::visualRect(opt.direction, opt.rect, geo).left() <= opt.rect.width() / 2)
header->orient...= Qt::VerticalDescription
TRUEnever evaluated
FALSEnever evaluated
header->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
QStyle::visual...ct.width() / 2Description
TRUEnever evaluated
FALSEnever evaluated
0
475 vHeaderRight = QStyle::visualRect(opt.direction, opt.rect, geo).right();
never executed: vHeaderRight = QStyle::visualRect(opt.direction, opt.rect, geo).right();
0
476 else if (header->orientation() == Qt::Horizontal && header->isVisible() && geo.top() <= q->frameWidth())
header->orient...Qt::HorizontalDescription
TRUEnever evaluated
FALSEnever evaluated
header->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
geo.top() <= q->frameWidth()Description
TRUEnever evaluated
FALSEnever evaluated
0
477 hHeaderBottom = geo.bottom();
never executed: hHeaderBottom = geo.bottom();
0
478 }
never executed: end of block
0
479 }
never executed: end of block
0
480 }
never executed: end of block
0
481-
482 if (needh) {
needhDescription
TRUEnever evaluated
FALSEnever evaluated
0
483 QRect horizontalScrollBarRect(QPoint(controlsRect.left() + vHeaderRight, cornerPoint.y()), QPoint(cornerPoint.x() - 1, controlsRect.bottom()));-
484#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
485 if (hasMacReverseSizeGrip)-
486 horizontalScrollBarRect.adjust(vsbExt, 0, 0, 0);-
487#endif-
488 if (!hasCornerWidget && htransient)
!hasCornerWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
htransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
489#ifdef Q_OS_MAC-
490 if (QSysInfo::macVersion() >= QSysInfo::MV_10_8)-
491#endif-
492 horizontalScrollBarRect.adjust(0, 0, cornerOffset.x(), 0);
never executed: horizontalScrollBarRect.adjust(0, 0, cornerOffset.x(), 0);
0
493 scrollBarContainers[Qt::Horizontal]->setGeometry(QStyle::visualRect(opt.direction, opt.rect, horizontalScrollBarRect));-
494 scrollBarContainers[Qt::Horizontal]->raise();-
495 }
never executed: end of block
0
496-
497 if (needv) {
needvDescription
TRUEnever evaluated
FALSEnever evaluated
0
498 QRect verticalScrollBarRect (QPoint(cornerPoint.x(), controlsRect.top() + hHeaderBottom), QPoint(controlsRect.right(), cornerPoint.y() - 1));-
499 if (!hasCornerWidget && vtransient)
!hasCornerWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
vtransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
500#ifdef Q_OS_MAC-
501 if (QSysInfo::macVersion() >= QSysInfo::MV_10_8)-
502#endif-
503 verticalScrollBarRect.adjust(0, 0, 0, cornerOffset.y());
never executed: verticalScrollBarRect.adjust(0, 0, 0, cornerOffset.y());
0
504 scrollBarContainers[Qt::Vertical]->setGeometry(QStyle::visualRect(opt.direction, opt.rect, verticalScrollBarRect));-
505 scrollBarContainers[Qt::Vertical]->raise();-
506 }
never executed: end of block
0
507-
508 if (cornerWidget) {
cornerWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
509 const QRect cornerWidgetRect(cornerPoint, controlsRect.bottomRight());-
510 cornerWidget->setGeometry(QStyle::visualRect(opt.direction, opt.rect, cornerWidgetRect));-
511 }
never executed: end of block
0
512-
513 scrollBarContainers[Qt::Horizontal]->setVisible(needh);-
514 scrollBarContainers[Qt::Vertical]->setVisible(needv);-
515-
516 if (q->isRightToLeft())
q->isRightToLeft()Description
TRUEnever evaluated
FALSEnever evaluated
0
517 viewportRect.adjust(right, top, -left, -bottom);
never executed: viewportRect.adjust(right, top, -left, -bottom);
0
518 else-
519 viewportRect.adjust(left, top, -right, -bottom);
never executed: viewportRect.adjust(left, top, -right, -bottom);
0
520-
521 viewport->setGeometry(QStyle::visualRect(opt.direction, opt.rect, viewportRect)); // resize the viewport last-
522}
never executed: end of block
0
523-
524/*!-
525 \enum QAbstractScrollArea::SizeAdjustPolicy-
526 \since 5.2-
527-
528 This enum specifies how the size hint of the QAbstractScrollArea should-
529 adjust when the size of the viewport changes.-
530-
531 \value AdjustIgnored The scroll area will behave like before - and not do any adjust.-
532 \value AdjustToContents The scroll area will always adjust to the viewport-
533 \value AdjustToContentsOnFirstShow The scroll area will adjust to its viewport the first time it is shown.-
534*/-
535-
536-
537/*!-
538 \internal-
539-
540 Creates a new QAbstractScrollAreaPrivate, \a dd with the given \a parent.-
541*/-
542QAbstractScrollArea::QAbstractScrollArea(QAbstractScrollAreaPrivate &dd, QWidget *parent)-
543 :QFrame(dd, parent)-
544{-
545 Q_D(QAbstractScrollArea);-
546 QT_TRY {-
547 d->init();-
548 } QT_CATCH(...) {
never executed: end of block
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
549 d->viewportFilter.reset();
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
550 QT_RETHROW;
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
551 }
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
552}-
553-
554/*!-
555 Constructs a viewport.-
556-
557 The \a parent argument is sent to the QWidget constructor.-
558*/-
559QAbstractScrollArea::QAbstractScrollArea(QWidget *parent)-
560 :QFrame(*new QAbstractScrollAreaPrivate, parent)-
561{-
562 Q_D(QAbstractScrollArea);-
563 QT_TRY {-
564 d->init();-
565 } QT_CATCH(...) {
never executed: end of block
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
566 d->viewportFilter.reset();
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
567 QT_RETHROW;
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
568 }
dead code: { d->viewportFilter.reset(); qt_noop(); }
-
569}-
570-
571-
572/*!-
573 Destroys the viewport.-
574 */-
575QAbstractScrollArea::~QAbstractScrollArea()-
576{-
577 Q_D(QAbstractScrollArea);-
578 // reset it here, otherwise we'll have a dangling pointer in ~QWidget-
579 d->viewportFilter.reset();-
580}
never executed: end of block
0
581-
582-
583/*!-
584 \since 4.2-
585 Sets the viewport to be the given \a widget.-
586 The QAbstractScrollArea will take ownership of the given \a widget.-
587-
588 If \a widget is 0, QAbstractScrollArea will assign a new QWidget instance-
589 for the viewport.-
590-
591 \sa viewport()-
592*/-
593void QAbstractScrollArea::setViewport(QWidget *widget)-
594{-
595 Q_D(QAbstractScrollArea);-
596 if (widget != d->viewport) {
widget != d->viewportDescription
TRUEnever evaluated
FALSEnever evaluated
0
597 QWidget *oldViewport = d->viewport;-
598 if (!widget)
!widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
599 widget = new QWidget;
never executed: widget = new QWidget;
0
600 d->viewport = widget;-
601 d->viewport->setParent(this);-
602 d->viewport->setFocusProxy(this);-
603 d->viewport->installEventFilter(d->viewportFilter.data());-
604#ifndef Q_DEAD_CODE_FROM_QT4_MAC-
605#ifndef QT_NO_GESTURES-
606 d->viewport->grabGesture(Qt::PanGesture);-
607#endif-
608#endif-
609 d->layoutChildren();-
610#ifndef QT_NO_OPENGL-
611 QWidgetPrivate::get(d->viewport)->initializeViewportFramebuffer();-
612#endif-
613 if (isVisible())
isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
614 d->viewport->show();
never executed: d->viewport->show();
0
615 setupViewport(widget);-
616 delete oldViewport;-
617 }
never executed: end of block
0
618}
never executed: end of block
0
619-
620/*!-
621 Returns the viewport widget.-
622-
623 Use the QScrollArea::widget() function to retrieve the contents of-
624 the viewport widget.-
625-
626 \sa QScrollArea::widget()-
627*/-
628QWidget *QAbstractScrollArea::viewport() const-
629{-
630 Q_D(const QAbstractScrollArea);-
631 return d->viewport;
never executed: return d->viewport;
0
632}-
633-
634-
635/*!-
636Returns the size of the viewport as if the scroll bars had no valid-
637scrolling range.-
638*/-
639// ### still thinking about the name-
640QSize QAbstractScrollArea::maximumViewportSize() const-
641{-
642 Q_D(const QAbstractScrollArea);-
643 int hsbExt = d->hbar->sizeHint().height();-
644 int vsbExt = d->vbar->sizeHint().width();-
645-
646 int f = 2 * d->frameWidth;-
647 QSize max = size() - QSize(f + d->left + d->right, f + d->top + d->bottom);-
648 if (d->vbarpolicy == Qt::ScrollBarAlwaysOn)
d->vbarpolicy ...ollBarAlwaysOnDescription
TRUEnever evaluated
FALSEnever evaluated
0
649 max.rwidth() -= vsbExt;
never executed: max.rwidth() -= vsbExt;
0
650 if (d->hbarpolicy == Qt::ScrollBarAlwaysOn)
d->hbarpolicy ...ollBarAlwaysOnDescription
TRUEnever evaluated
FALSEnever evaluated
0
651 max.rheight() -= hsbExt;
never executed: max.rheight() -= hsbExt;
0
652 return max;
never executed: return max;
0
653}-
654-
655/*!-
656 \property QAbstractScrollArea::verticalScrollBarPolicy-
657 \brief the policy for the vertical scroll bar-
658-
659 The default policy is Qt::ScrollBarAsNeeded.-
660-
661 \sa horizontalScrollBarPolicy-
662*/-
663-
664Qt::ScrollBarPolicy QAbstractScrollArea::verticalScrollBarPolicy() const-
665{-
666 Q_D(const QAbstractScrollArea);-
667 return d->vbarpolicy;
never executed: return d->vbarpolicy;
0
668}-
669-
670void QAbstractScrollArea::setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy)-
671{-
672 Q_D(QAbstractScrollArea);-
673 const Qt::ScrollBarPolicy oldPolicy = d->vbarpolicy;-
674 d->vbarpolicy = policy;-
675 if (isVisible())
isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
676 d->layoutChildren();
never executed: d->layoutChildren();
0
677 if (oldPolicy != d->vbarpolicy)
oldPolicy != d->vbarpolicyDescription
TRUEnever evaluated
FALSEnever evaluated
0
678 d->scrollBarPolicyChanged(Qt::Vertical, d->vbarpolicy);
never executed: d->scrollBarPolicyChanged(Qt::Vertical, d->vbarpolicy);
0
679}
never executed: end of block
0
680-
681-
682/*!-
683 Returns the vertical scroll bar.-
684-
685 \sa verticalScrollBarPolicy, horizontalScrollBar()-
686 */-
687QScrollBar *QAbstractScrollArea::verticalScrollBar() const-
688{-
689 Q_D(const QAbstractScrollArea);-
690 return d->vbar;
never executed: return d->vbar;
0
691}-
692-
693/*!-
694 \since 4.2-
695 Replaces the existing vertical scroll bar with \a scrollBar, and sets all-
696 the former scroll bar's slider properties on the new scroll bar. The former-
697 scroll bar is then deleted.-
698-
699 QAbstractScrollArea already provides vertical and horizontal scroll bars by-
700 default. You can call this function to replace the default vertical-
701 scroll bar with your own custom scroll bar.-
702-
703 \sa verticalScrollBar(), setHorizontalScrollBar()-
704*/-
705void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar)-
706{-
707 Q_D(QAbstractScrollArea);-
708 if (!scrollBar) {
!scrollBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
709 qWarning("QAbstractScrollArea::setVerticalScrollBar: Cannot set a null scroll bar");-
710 return;
never executed: return;
0
711 }-
712-
713 d->replaceScrollBar(scrollBar, Qt::Vertical);-
714}
never executed: end of block
0
715-
716/*!-
717 \property QAbstractScrollArea::horizontalScrollBarPolicy-
718 \brief the policy for the horizontal scroll bar-
719-
720 The default policy is Qt::ScrollBarAsNeeded.-
721-
722 \sa verticalScrollBarPolicy-
723*/-
724-
725Qt::ScrollBarPolicy QAbstractScrollArea::horizontalScrollBarPolicy() const-
726{-
727 Q_D(const QAbstractScrollArea);-
728 return d->hbarpolicy;
never executed: return d->hbarpolicy;
0
729}-
730-
731void QAbstractScrollArea::setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy)-
732{-
733 Q_D(QAbstractScrollArea);-
734 const Qt::ScrollBarPolicy oldPolicy = d->hbarpolicy;-
735 d->hbarpolicy = policy;-
736 if (isVisible())
isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
737 d->layoutChildren();
never executed: d->layoutChildren();
0
738 if (oldPolicy != d->hbarpolicy)
oldPolicy != d->hbarpolicyDescription
TRUEnever evaluated
FALSEnever evaluated
0
739 d->scrollBarPolicyChanged(Qt::Horizontal, d->hbarpolicy);
never executed: d->scrollBarPolicyChanged(Qt::Horizontal, d->hbarpolicy);
0
740}
never executed: end of block
0
741-
742/*!-
743 Returns the horizontal scroll bar.-
744-
745 \sa horizontalScrollBarPolicy, verticalScrollBar()-
746 */-
747QScrollBar *QAbstractScrollArea::horizontalScrollBar() const-
748{-
749 Q_D(const QAbstractScrollArea);-
750 return d->hbar;
never executed: return d->hbar;
0
751}-
752-
753/*!-
754 \since 4.2-
755-
756 Replaces the existing horizontal scroll bar with \a scrollBar, and sets all-
757 the former scroll bar's slider properties on the new scroll bar. The former-
758 scroll bar is then deleted.-
759-
760 QAbstractScrollArea already provides horizontal and vertical scroll bars by-
761 default. You can call this function to replace the default horizontal-
762 scroll bar with your own custom scroll bar.-
763-
764 \sa horizontalScrollBar(), setVerticalScrollBar()-
765*/-
766void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar)-
767{-
768 Q_D(QAbstractScrollArea);-
769 if (!scrollBar) {
!scrollBarDescription
TRUEnever evaluated
FALSEnever evaluated
0
770 qWarning("QAbstractScrollArea::setHorizontalScrollBar: Cannot set a null scroll bar");-
771 return;
never executed: return;
0
772 }-
773-
774 d->replaceScrollBar(scrollBar, Qt::Horizontal);-
775}
never executed: end of block
0
776-
777/*!-
778 \since 4.2-
779-
780 Returns the widget in the corner between the two scroll bars.-
781-
782 By default, no corner widget is present.-
783*/-
784QWidget *QAbstractScrollArea::cornerWidget() const-
785{-
786 Q_D(const QAbstractScrollArea);-
787 return d->cornerWidget;
never executed: return d->cornerWidget;
0
788}-
789-
790/*!-
791 \since 4.2-
792-
793 Sets the widget in the corner between the two scroll bars to be-
794 \a widget.-
795-
796 You will probably also want to set at least one of the scroll bar-
797 modes to \c AlwaysOn.-
798-
799 Passing 0 shows no widget in the corner.-
800-
801 Any previous corner widget is hidden.-
802-
803 You may call setCornerWidget() with the same widget at different-
804 times.-
805-
806 All widgets set here will be deleted by the scroll area when it is-
807 destroyed unless you separately reparent the widget after setting-
808 some other corner widget (or 0).-
809-
810 Any \e newly set widget should have no current parent.-
811-
812 By default, no corner widget is present.-
813-
814 \sa horizontalScrollBarPolicy, horizontalScrollBarPolicy-
815*/-
816void QAbstractScrollArea::setCornerWidget(QWidget *widget)-
817{-
818 Q_D(QAbstractScrollArea);-
819 QWidget* oldWidget = d->cornerWidget;-
820 if (oldWidget != widget) {
oldWidget != widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
821 if (oldWidget)
oldWidgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
822 oldWidget->hide();
never executed: oldWidget->hide();
0
823 d->cornerWidget = widget;-
824-
825 if (widget && widget->parentWidget() != this)
widgetDescription
TRUEnever evaluated
FALSEnever evaluated
widget->parentWidget() != thisDescription
TRUEnever evaluated
FALSEnever evaluated
0
826 widget->setParent(this);
never executed: widget->setParent(this);
0
827-
828 d->layoutChildren();-
829 if (widget)
widgetDescription
TRUEnever evaluated
FALSEnever evaluated
0
830 widget->show();
never executed: widget->show();
0
831 } else {
never executed: end of block
0
832 d->cornerWidget = widget;-
833 d->layoutChildren();-
834 }
never executed: end of block
0
835}-
836-
837/*!-
838 \since 4.2-
839 Adds \a widget as a scroll bar widget in the location specified-
840 by \a alignment.-
841-
842 Scroll bar widgets are shown next to the horizontal or vertical-
843 scroll bar, and can be placed on either side of it. If you want-
844 the scroll bar widgets to be always visible, set the-
845 scrollBarPolicy for the corresponding scroll bar to \c AlwaysOn.-
846-
847 \a alignment must be one of Qt::Alignleft and Qt::AlignRight,-
848 which maps to the horizontal scroll bar, or Qt::AlignTop and-
849 Qt::AlignBottom, which maps to the vertical scroll bar.-
850-
851 A scroll bar widget can be removed by either re-parenting the-
852 widget or deleting it. It's also possible to hide a widget with-
853 QWidget::hide()-
854-
855 The scroll bar widget will be resized to fit the scroll bar-
856 geometry for the current style. The following describes the case-
857 for scroll bar widgets on the horizontal scroll bar:-
858-
859 The height of the widget will be set to match the height of the-
860 scroll bar. To control the width of the widget, use-
861 QWidget::setMinimumWidth and QWidget::setMaximumWidth, or-
862 implement QWidget::sizeHint() and set a horizontal size policy.-
863 If you want a square widget, call-
864 QStyle::pixelMetric(QStyle::PM_ScrollBarExtent) and set the-
865 width to this value.-
866-
867 \sa scrollBarWidgets()-
868*/-
869void QAbstractScrollArea::addScrollBarWidget(QWidget *widget, Qt::Alignment alignment)-
870{-
871 Q_D(QAbstractScrollArea);-
872-
873 if (widget == 0)
widget == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
874 return;
never executed: return;
0
875-
876 const Qt::Orientation scrollBarOrientation-
877 = ((alignment & Qt::AlignLeft) || (alignment & Qt::AlignRight)) ? Qt::Horizontal : Qt::Vertical;
(alignment & Qt::AlignLeft)Description
TRUEnever evaluated
FALSEnever evaluated
(alignment & Qt::AlignRight)Description
TRUEnever evaluated
FALSEnever evaluated
0
878 const QAbstractScrollAreaScrollBarContainer::LogicalPosition position-
879 = ((alignment & Qt::AlignRight) || (alignment & Qt::AlignBottom))
(alignment & Qt::AlignRight)Description
TRUEnever evaluated
FALSEnever evaluated
(alignment & Qt::AlignBottom)Description
TRUEnever evaluated
FALSEnever evaluated
0
880 ? QAbstractScrollAreaScrollBarContainer::LogicalRight : QAbstractScrollAreaScrollBarContainer::LogicalLeft;-
881 d->scrollBarContainers[scrollBarOrientation]->addWidget(widget, position);-
882 d->layoutChildren();-
883 if (isHidden() == false)
isHidden() == falseDescription
TRUEnever evaluated
FALSEnever evaluated
0
884 widget->show();
never executed: widget->show();
0
885}
never executed: end of block
0
886-
887/*!-
888 \since 4.2-
889 Returns a list of the currently set scroll bar widgets. \a alignment-
890 can be any combination of the four location flags.-
891-
892 \sa addScrollBarWidget()-
893*/-
894QWidgetList QAbstractScrollArea::scrollBarWidgets(Qt::Alignment alignment)-
895{-
896 Q_D(QAbstractScrollArea);-
897-
898 QWidgetList list;-
899-
900 if (alignment & Qt::AlignLeft)
alignment & Qt::AlignLeftDescription
TRUEnever evaluated
FALSEnever evaluated
0
901 list += d->scrollBarContainers[Qt::Horizontal]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalLeft);
never executed: list += d->scrollBarContainers[Qt::Horizontal]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalLeft);
0
902 if (alignment & Qt::AlignRight)
alignment & Qt::AlignRightDescription
TRUEnever evaluated
FALSEnever evaluated
0
903 list += d->scrollBarContainers[Qt::Horizontal]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalRight);
never executed: list += d->scrollBarContainers[Qt::Horizontal]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalRight);
0
904 if (alignment & Qt::AlignTop)
alignment & Qt::AlignTopDescription
TRUEnever evaluated
FALSEnever evaluated
0
905 list += d->scrollBarContainers[Qt::Vertical]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalLeft);
never executed: list += d->scrollBarContainers[Qt::Vertical]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalLeft);
0
906 if (alignment & Qt::AlignBottom)
alignment & Qt::AlignBottomDescription
TRUEnever evaluated
FALSEnever evaluated
0
907 list += d->scrollBarContainers[Qt::Vertical]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalRight);
never executed: list += d->scrollBarContainers[Qt::Vertical]->widgets(QAbstractScrollAreaScrollBarContainer::LogicalRight);
0
908-
909 return list;
never executed: return list;
0
910}-
911-
912/*!-
913 Sets the margins around the scrolling area to \a left, \a top, \a-
914 right and \a bottom. This is useful for applications such as-
915 spreadsheets with "locked" rows and columns. The marginal space is-
916 is left blank; put widgets in the unused area.-
917-
918 Note that this function is frequently called by QTreeView and-
919 QTableView, so margins must be implemented by QAbstractScrollArea-
920 subclasses. Also, if the subclasses are to be used in item views,-
921 they should not call this function.-
922-
923 By default all margins are zero.-
924 \sa viewportMargins()-
925*/-
926void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom)-
927{-
928 Q_D(QAbstractScrollArea);-
929 d->left = left;-
930 d->top = top;-
931 d->right = right;-
932 d->bottom = bottom;-
933 d->layoutChildren();-
934}
never executed: end of block
0
935-
936/*!-
937 \since 4.6-
938 Sets \a margins around the scrolling area. This is useful for-
939 applications such as spreadsheets with "locked" rows and columns.-
940 The marginal space is is left blank; put widgets in the unused-
941 area.-
942-
943 By default all margins are zero.-
944 \sa viewportMargins()-
945*/-
946void QAbstractScrollArea::setViewportMargins(const QMargins &margins)-
947{-
948 setViewportMargins(margins.left(), margins.top(),-
949 margins.right(), margins.bottom());-
950}
never executed: end of block
0
951-
952/*!-
953 \since 5.5-
954 Returns the margins around the scrolling area.-
955 By default all the margins are zero.-
956-
957 \sa setViewportMargins()-
958*/-
959QMargins QAbstractScrollArea::viewportMargins() const-
960{-
961 Q_D(const QAbstractScrollArea);-
962 return QMargins(d->left, d->top, d->right, d->bottom);
never executed: return QMargins(d->left, d->top, d->right, d->bottom);
0
963}-
964-
965/*! \internal */-
966bool QAbstractScrollArea::eventFilter(QObject *o, QEvent *e)-
967{-
968 Q_D(QAbstractScrollArea);-
969 if ((o == d->hbar || o == d->vbar) && (e->type() == QEvent::HoverEnter || e->type() == QEvent::HoverLeave)) {
o == d->hbarDescription
TRUEnever evaluated
FALSEnever evaluated
o == d->vbarDescription
TRUEnever evaluated
FALSEnever evaluated
e->type() == Q...nt::HoverEnterDescription
TRUEnever evaluated
FALSEnever evaluated
e->type() == Q...nt::HoverLeaveDescription
TRUEnever evaluated
FALSEnever evaluated
0
970 if (d->hbarpolicy == Qt::ScrollBarAsNeeded && d->vbarpolicy == Qt::ScrollBarAsNeeded) {
d->hbarpolicy ...ollBarAsNeededDescription
TRUEnever evaluated
FALSEnever evaluated
d->vbarpolicy ...ollBarAsNeededDescription
TRUEnever evaluated
FALSEnever evaluated
0
971 QScrollBar *sbar = static_cast<QScrollBar*>(o);-
972 QScrollBar *sibling = sbar == d->hbar ? d->vbar : d->hbar;
sbar == d->hbarDescription
TRUEnever evaluated
FALSEnever evaluated
0
973 if (sbar->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, sbar) &&
sbar->style()-...ient, 0, sbar)Description
TRUEnever evaluated
FALSEnever evaluated
0
974 sibling->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, sibling))
sibling->style...t, 0, sibling)Description
TRUEnever evaluated
FALSEnever evaluated
0
975 d->setScrollBarTransient(sibling, e->type() == QEvent::HoverLeave);
never executed: d->setScrollBarTransient(sibling, e->type() == QEvent::HoverLeave);
0
976 }
never executed: end of block
0
977 }
never executed: end of block
0
978 return QFrame::eventFilter(o, e);
never executed: return QFrame::eventFilter(o, e);
0
979}-
980-
981/*!-
982 \fn bool QAbstractScrollArea::event(QEvent *event)-
983-
984 \reimp-
985-
986 This is the main event handler for the QAbstractScrollArea widget (\e not-
987 the scrolling area viewport()). The specified \a event is a general event-
988 object that may need to be cast to the appropriate class depending on its-
989 type.-
990-
991 \sa QEvent::type()-
992*/-
993bool QAbstractScrollArea::event(QEvent *e)-
994{-
995 Q_D(QAbstractScrollArea);-
996 switch (e->type()) {-
997 case QEvent::AcceptDropsChange:
never executed: case QEvent::AcceptDropsChange:
0
998 // There was a chance that with accessibility client we get an-
999 // event before the viewport was created.-
1000 // Also, in some cases we might get here from QWidget::event() virtual function which is (indirectly) called-
1001 // from the viewport constructor at the time when the d->viewport is not yet initialized even without any-
1002 // accessibility client. See qabstractscrollarea autotest for a test case.-
1003 if (d->viewport)
d->viewportDescription
TRUEnever evaluated
FALSEnever evaluated
0
1004 d->viewport->setAcceptDrops(acceptDrops());
never executed: d->viewport->setAcceptDrops(acceptDrops());
0
1005 break;
never executed: break;
0
1006 case QEvent::MouseTrackingChange:
never executed: case QEvent::MouseTrackingChange:
0
1007 d->viewport->setMouseTracking(hasMouseTracking());-
1008 break;
never executed: break;
0
1009 case QEvent::Resize:
never executed: case QEvent::Resize:
0
1010 if (!d->inResize) {
!d->inResizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1011 d->inResize = true;-
1012 d->layoutChildren();-
1013 d->inResize = false;-
1014 }
never executed: end of block
0
1015 break;
never executed: break;
0
1016 case QEvent::Show:
never executed: case QEvent::Show:
0
1017 if (!d->shownOnce && d->sizeAdjustPolicy == QAbstractScrollArea::AdjustToContentsOnFirstShow) {
!d->shownOnceDescription
TRUEnever evaluated
FALSEnever evaluated
d->sizeAdjustP...ntsOnFirstShowDescription
TRUEnever evaluated
FALSEnever evaluated
0
1018 d->sizeHint = QSize();-
1019 updateGeometry();-
1020 }
never executed: end of block
0
1021 d->shownOnce = true;-
1022 return QFrame::event(e);
never executed: return QFrame::event(e);
0
1023 case QEvent::Paint: {
never executed: case QEvent::Paint:
0
1024 QStyleOption option;-
1025 option.initFrom(this);-
1026 if (d->cornerPaintingRect.isValid()) {
d->cornerPaint...Rect.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
1027 option.rect = d->cornerPaintingRect;-
1028 QPainter p(this);-
1029 style()->drawPrimitive(QStyle::PE_PanelScrollAreaCorner, &option, &p, this);-
1030 }
never executed: end of block
0
1031#ifdef Q_DEAD_CODE_FROM_QT4_MAC-
1032 if (d->reverseCornerPaintingRect.isValid()) {-
1033 option.rect = d->reverseCornerPaintingRect;-
1034 QPainter p(this);-
1035 style()->drawPrimitive(QStyle::PE_PanelScrollAreaCorner, &option, &p, this);-
1036 }-
1037#endif-
1038 }-
1039 QFrame::paintEvent((QPaintEvent*)e);-
1040 break;
never executed: break;
0
1041#ifndef QT_NO_CONTEXTMENU-
1042 case QEvent::ContextMenu:
never executed: case QEvent::ContextMenu:
0
1043 if (static_cast<QContextMenuEvent *>(e)->reason() == QContextMenuEvent::Keyboard)
static_cast<QC...vent::KeyboardDescription
TRUEnever evaluated
FALSEnever evaluated
0
1044 return QFrame::event(e);
never executed: return QFrame::event(e);
0
1045 e->ignore();-
1046 break;
never executed: break;
0
1047#endif // QT_NO_CONTEXTMENU-
1048 case QEvent::MouseButtonPress:
never executed: case QEvent::MouseButtonPress:
0
1049 case QEvent::MouseButtonRelease:
never executed: case QEvent::MouseButtonRelease:
0
1050 case QEvent::MouseButtonDblClick:
never executed: case QEvent::MouseButtonDblClick:
0
1051 case QEvent::MouseMove:
never executed: case QEvent::MouseMove:
0
1052 case QEvent::Wheel:
never executed: case QEvent::Wheel:
0
1053#ifndef QT_NO_DRAGANDDROP-
1054 case QEvent::Drop:
never executed: case QEvent::Drop:
0
1055 case QEvent::DragEnter:
never executed: case QEvent::DragEnter:
0
1056 case QEvent::DragMove:
never executed: case QEvent::DragMove:
0
1057 case QEvent::DragLeave:
never executed: case QEvent::DragLeave:
0
1058#endif-
1059 // ignore touch events in case they have been propagated from the viewport-
1060 case QEvent::TouchBegin:
never executed: case QEvent::TouchBegin:
0
1061 case QEvent::TouchUpdate:
never executed: case QEvent::TouchUpdate:
0
1062 case QEvent::TouchEnd:
never executed: case QEvent::TouchEnd:
0
1063 return false;
never executed: return false;
0
1064#ifndef QT_NO_GESTURES-
1065 case QEvent::Gesture:
never executed: case QEvent::Gesture:
0
1066 {-
1067 QGestureEvent *ge = static_cast<QGestureEvent *>(e);-
1068 QPanGesture *g = static_cast<QPanGesture *>(ge->gesture(Qt::PanGesture));-
1069 if (g) {
gDescription
TRUEnever evaluated
FALSEnever evaluated
0
1070 QScrollBar *hBar = horizontalScrollBar();-
1071 QScrollBar *vBar = verticalScrollBar();-
1072 QPointF delta = g->delta();-
1073 if (!delta.isNull()) {
!delta.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
1074 if (QApplication::isRightToLeft())
QApplication::isRightToLeft()Description
TRUEnever evaluated
FALSEnever evaluated
0
1075 delta.rx() *= -1;
never executed: delta.rx() *= -1;
0
1076 int newX = hBar->value() - delta.x();-
1077 int newY = vBar->value() - delta.y();-
1078 hBar->setValue(newX);-
1079 vBar->setValue(newY);-
1080 }
never executed: end of block
0
1081 return true;
never executed: return true;
0
1082 }-
1083 return false;
never executed: return false;
0
1084 }-
1085#endif // QT_NO_GESTURES-
1086 case QEvent::ScrollPrepare:
never executed: case QEvent::ScrollPrepare:
0
1087 {-
1088 QScrollPrepareEvent *se = static_cast<QScrollPrepareEvent *>(e);-
1089 if (d->canStartScrollingAt(se->startPos().toPoint())) {
d->canStartScr...s().toPoint())Description
TRUEnever evaluated
FALSEnever evaluated
0
1090 QScrollBar *hBar = horizontalScrollBar();-
1091 QScrollBar *vBar = verticalScrollBar();-
1092-
1093 se->setViewportSize(QSizeF(viewport()->size()));-
1094 se->setContentPosRange(QRectF(0, 0, hBar->maximum(), vBar->maximum()));-
1095 se->setContentPos(QPointF(hBar->value(), vBar->value()));-
1096 se->accept();-
1097 return true;
never executed: return true;
0
1098 }-
1099 return false;
never executed: return false;
0
1100 }-
1101 case QEvent::Scroll:
never executed: case QEvent::Scroll:
0
1102 {-
1103 QScrollEvent *se = static_cast<QScrollEvent *>(e);-
1104-
1105 QScrollBar *hBar = horizontalScrollBar();-
1106 QScrollBar *vBar = verticalScrollBar();-
1107 hBar->setValue(se->contentPos().x());-
1108 vBar->setValue(se->contentPos().y());-
1109-
1110#ifdef Q_DEAD_CODE_FROM_QT4_WIN-
1111 typedef BOOL (*PtrBeginPanningFeedback)(HWND);-
1112 typedef BOOL (*PtrUpdatePanningFeedback)(HWND, LONG, LONG, BOOL);-
1113 typedef BOOL (*PtrEndPanningFeedback)(HWND, BOOL);-
1114-
1115 static PtrBeginPanningFeedback ptrBeginPanningFeedback = 0;-
1116 static PtrUpdatePanningFeedback ptrUpdatePanningFeedback = 0;-
1117 static PtrEndPanningFeedback ptrEndPanningFeedback = 0;-
1118-
1119 if (!ptrBeginPanningFeedback)-
1120 ptrBeginPanningFeedback = (PtrBeginPanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "BeginPanningFeedback");-
1121 if (!ptrUpdatePanningFeedback)-
1122 ptrUpdatePanningFeedback = (PtrUpdatePanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "UpdatePanningFeedback");-
1123 if (!ptrEndPanningFeedback)-
1124 ptrEndPanningFeedback = (PtrEndPanningFeedback) QLibrary::resolve(QLatin1String("UxTheme"), "EndPanningFeedback");-
1125-
1126 if (ptrBeginPanningFeedback && ptrUpdatePanningFeedback && ptrEndPanningFeedback) {-
1127 WId wid = window()->winId();-
1128-
1129 if (!se->overshootDistance().isNull() && d->overshoot.isNull())-
1130 ptrBeginPanningFeedback(wid);-
1131 if (!se->overshootDistance().isNull())-
1132 ptrUpdatePanningFeedback(wid, -se->overshootDistance().x(), -se->overshootDistance().y(), false);-
1133 if (se->overshootDistance().isNull() && !d->overshoot.isNull())-
1134 ptrEndPanningFeedback(wid, true);-
1135 } else-
1136#endif-
1137 {-
1138 QPoint delta = d->overshoot - se->overshootDistance().toPoint();-
1139 if (!delta.isNull())
!delta.isNull()Description
TRUEnever evaluated
FALSEnever evaluated
0
1140 viewport()->move(viewport()->pos() + delta);
never executed: viewport()->move(viewport()->pos() + delta);
0
1141 }-
1142 d->overshoot = se->overshootDistance().toPoint();-
1143-
1144 return true;
never executed: return true;
0
1145 }-
1146 case QEvent::StyleChange:
never executed: case QEvent::StyleChange:
0
1147 case QEvent::LayoutDirectionChange:
never executed: case QEvent::LayoutDirectionChange:
0
1148 case QEvent::ApplicationLayoutDirectionChange:
never executed: case QEvent::ApplicationLayoutDirectionChange:
0
1149 case QEvent::LayoutRequest:
never executed: case QEvent::LayoutRequest:
0
1150 d->layoutChildren();-
1151 // fall through-
1152 default:
code before this statement never executed: default:
never executed: default:
0
1153 return QFrame::event(e);
never executed: return QFrame::event(e);
0
1154 }-
1155 return true;
never executed: return true;
0
1156}-
1157-
1158/*!-
1159 \fn bool QAbstractScrollArea::viewportEvent(QEvent *event)-
1160-
1161 The main event handler for the scrolling area (the viewport() widget).-
1162 It handles the \a event specified, and can be called by subclasses to-
1163 provide reasonable default behavior.-
1164-
1165 Returns \c true to indicate to the event system that the event has been-
1166 handled, and needs no further processing; otherwise returns \c false to-
1167 indicate that the event should be propagated further.-
1168-
1169 You can reimplement this function in a subclass, but we recommend-
1170 using one of the specialized event handlers instead.-
1171-
1172 Specialized handlers for viewport events are: paintEvent(),-
1173 mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(),-
1174 mouseMoveEvent(), wheelEvent(), dragEnterEvent(), dragMoveEvent(),-
1175 dragLeaveEvent(), dropEvent(), contextMenuEvent(), and-
1176 resizeEvent().-
1177*/-
1178bool QAbstractScrollArea::viewportEvent(QEvent *e)-
1179{-
1180 switch (e->type()) {-
1181 case QEvent::Resize:
never executed: case QEvent::Resize:
0
1182 case QEvent::Paint:
never executed: case QEvent::Paint:
0
1183 case QEvent::MouseButtonPress:
never executed: case QEvent::MouseButtonPress:
0
1184 case QEvent::MouseButtonRelease:
never executed: case QEvent::MouseButtonRelease:
0
1185 case QEvent::MouseButtonDblClick:
never executed: case QEvent::MouseButtonDblClick:
0
1186 case QEvent::TouchBegin:
never executed: case QEvent::TouchBegin:
0
1187 case QEvent::TouchUpdate:
never executed: case QEvent::TouchUpdate:
0
1188 case QEvent::TouchEnd:
never executed: case QEvent::TouchEnd:
0
1189 case QEvent::MouseMove:
never executed: case QEvent::MouseMove:
0
1190 case QEvent::ContextMenu:
never executed: case QEvent::ContextMenu:
0
1191#ifndef QT_NO_WHEELEVENT-
1192 case QEvent::Wheel:
never executed: case QEvent::Wheel:
0
1193#endif-
1194#ifndef QT_NO_DRAGANDDROP-
1195 case QEvent::Drop:
never executed: case QEvent::Drop:
0
1196 case QEvent::DragEnter:
never executed: case QEvent::DragEnter:
0
1197 case QEvent::DragMove:
never executed: case QEvent::DragMove:
0
1198 case QEvent::DragLeave:
never executed: case QEvent::DragLeave:
0
1199#endif-
1200#ifndef QT_NO_OPENGL-
1201 // QOpenGLWidget needs special support because it has to know-
1202 // its size has changed, so that it can resize its fbo.-
1203 if (e->type() == QEvent::Resize)
e->type() == QEvent::ResizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1204 QWidgetPrivate::get(viewport())->resizeViewportFramebuffer();
never executed: QWidgetPrivate::get(viewport())->resizeViewportFramebuffer();
0
1205#endif-
1206 return QFrame::event(e);
never executed: return QFrame::event(e);
0
1207 case QEvent::LayoutRequest:
never executed: case QEvent::LayoutRequest:
0
1208#ifndef QT_NO_GESTURES-
1209 case QEvent::Gesture:
never executed: case QEvent::Gesture:
0
1210 case QEvent::GestureOverride:
never executed: case QEvent::GestureOverride:
0
1211 return event(e);
never executed: return event(e);
0
1212#endif-
1213 case QEvent::ScrollPrepare:
never executed: case QEvent::ScrollPrepare:
0
1214 case QEvent::Scroll:
never executed: case QEvent::Scroll:
0
1215 return event(e);
never executed: return event(e);
0
1216 default:
never executed: default:
0
1217 break;
never executed: break;
0
1218 }-
1219 return false; // let the viewport widget handle the event
never executed: return false;
0
1220}-
1221-
1222/*!-
1223 \fn void QAbstractScrollArea::resizeEvent(QResizeEvent *event)-
1224-
1225 This event handler can be reimplemented in a subclass to receive-
1226 resize events (passed in \a event), for the viewport() widget.-
1227-
1228 When resizeEvent() is called, the viewport already has its new-
1229 geometry: Its new size is accessible through the-
1230 QResizeEvent::size() function, and the old size through-
1231 QResizeEvent::oldSize().-
1232-
1233 \sa QWidget::resizeEvent()-
1234 */-
1235void QAbstractScrollArea::resizeEvent(QResizeEvent *)-
1236{-
1237}-
1238-
1239/*!-
1240 \fn void QAbstractScrollArea::paintEvent(QPaintEvent *event)-
1241-
1242 This event handler can be reimplemented in a subclass to receive-
1243 paint events (passed in \a event), for the viewport() widget.-
1244-
1245 \note If you open a painter, make sure to open it on the viewport().-
1246-
1247 \sa QWidget::paintEvent()-
1248*/-
1249void QAbstractScrollArea::paintEvent(QPaintEvent*)-
1250{-
1251}-
1252-
1253/*!-
1254 This event handler can be reimplemented in a subclass to receive-
1255 mouse press events for the viewport() widget. The event is passed-
1256 in \a e.-
1257-
1258 \sa QWidget::mousePressEvent()-
1259*/-
1260void QAbstractScrollArea::mousePressEvent(QMouseEvent *e)-
1261{-
1262 e->ignore();-
1263}
never executed: end of block
0
1264-
1265/*!-
1266 This event handler can be reimplemented in a subclass to receive-
1267 mouse release events for the viewport() widget. The event is-
1268 passed in \a e.-
1269-
1270 \sa QWidget::mouseReleaseEvent()-
1271*/-
1272void QAbstractScrollArea::mouseReleaseEvent(QMouseEvent *e)-
1273{-
1274 e->ignore();-
1275}
never executed: end of block
0
1276-
1277/*!-
1278 This event handler can be reimplemented in a subclass to receive-
1279 mouse double click events for the viewport() widget. The event is-
1280 passed in \a e.-
1281-
1282 \sa QWidget::mouseDoubleClickEvent()-
1283*/-
1284void QAbstractScrollArea::mouseDoubleClickEvent(QMouseEvent *e)-
1285{-
1286 e->ignore();-
1287}
never executed: end of block
0
1288-
1289/*!-
1290 This event handler can be reimplemented in a subclass to receive-
1291 mouse move events for the viewport() widget. The event is passed-
1292 in \a e.-
1293-
1294 \sa QWidget::mouseMoveEvent()-
1295*/-
1296void QAbstractScrollArea::mouseMoveEvent(QMouseEvent *e)-
1297{-
1298 e->ignore();-
1299}
never executed: end of block
0
1300-
1301/*!-
1302 This event handler can be reimplemented in a subclass to receive-
1303 wheel events for the viewport() widget. The event is passed in \a-
1304 e.-
1305-
1306 \sa QWidget::wheelEvent()-
1307*/-
1308#ifndef QT_NO_WHEELEVENT-
1309void QAbstractScrollArea::wheelEvent(QWheelEvent *e)-
1310{-
1311 Q_D(QAbstractScrollArea);-
1312 if (static_cast<QWheelEvent*>(e)->orientation() == Qt::Horizontal)
static_cast<QW...Qt::HorizontalDescription
TRUEnever evaluated
FALSEnever evaluated
0
1313 QApplication::sendEvent(d->hbar, e);
never executed: QApplication::sendEvent(d->hbar, e);
0
1314 else-
1315 QApplication::sendEvent(d->vbar, e);
never executed: QApplication::sendEvent(d->vbar, e);
0
1316}-
1317#endif-
1318-
1319#ifndef QT_NO_CONTEXTMENU-
1320/*!-
1321 This event handler can be reimplemented in a subclass to receive-
1322 context menu events for the viewport() widget. The event is passed-
1323 in \a e.-
1324-
1325 \sa QWidget::contextMenuEvent()-
1326*/-
1327void QAbstractScrollArea::contextMenuEvent(QContextMenuEvent *e)-
1328{-
1329 e->ignore();-
1330}
never executed: end of block
0
1331#endif // QT_NO_CONTEXTMENU-
1332-
1333/*!-
1334 This function is called with key event \a e when key presses-
1335 occur. It handles PageUp, PageDown, Up, Down, Left, and Right, and-
1336 ignores all other key presses.-
1337*/-
1338void QAbstractScrollArea::keyPressEvent(QKeyEvent * e)-
1339{-
1340 Q_D(QAbstractScrollArea);-
1341 if (false){
dead code: { }
-
1342#ifndef QT_NO_SHORTCUT
dead code: { }
-
1343 } else if (e == QKeySequence::MoveToPreviousPage) {
e == QKeySeque...ToPreviousPageDescription
TRUEnever evaluated
FALSEnever evaluated
dead code: { }
-
1344 d->vbar->triggerAction(QScrollBar::SliderPageStepSub);-
1345 } else if (e == QKeySequence::MoveToNextPage) {
never executed: end of block
e == QKeySeque...MoveToNextPageDescription
TRUEnever evaluated
FALSEnever evaluated
0
1346 d->vbar->triggerAction(QScrollBar::SliderPageStepAdd);-
1347#endif-
1348 } else {
never executed: end of block
0
1349#ifdef QT_KEYPAD_NAVIGATION-
1350 if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) {-
1351 e->ignore();-
1352 return;-
1353 }-
1354#endif-
1355 switch (e->key()) {-
1356 case Qt::Key_Up:
never executed: case Qt::Key_Up:
0
1357 d->vbar->triggerAction(QScrollBar::SliderSingleStepSub);-
1358 break;
never executed: break;
0
1359 case Qt::Key_Down:
never executed: case Qt::Key_Down:
0
1360 d->vbar->triggerAction(QScrollBar::SliderSingleStepAdd);-
1361 break;
never executed: break;
0
1362 case Qt::Key_Left:
never executed: case Qt::Key_Left:
0
1363#ifdef QT_KEYPAD_NAVIGATION-
1364 if (QApplication::keypadNavigationEnabled() && hasEditFocus()-
1365 && (!d->hbar->isVisible() || d->hbar->value() == d->hbar->minimum())) {-
1366 //if we aren't using the hbar or we are already at the leftmost point ignore-
1367 e->ignore();-
1368 return;-
1369 }-
1370#endif-
1371 d->hbar->triggerAction(-
1372 layoutDirection() == Qt::LeftToRight-
1373 ? QScrollBar::SliderSingleStepSub : QScrollBar::SliderSingleStepAdd);-
1374 break;
never executed: break;
0
1375 case Qt::Key_Right:
never executed: case Qt::Key_Right:
0
1376#ifdef QT_KEYPAD_NAVIGATION-
1377 if (QApplication::keypadNavigationEnabled() && hasEditFocus()-
1378 && (!d->hbar->isVisible() || d->hbar->value() == d->hbar->maximum())) {-
1379 //if we aren't using the hbar or we are already at the rightmost point ignore-
1380 e->ignore();-
1381 return;-
1382 }-
1383#endif-
1384 d->hbar->triggerAction(-
1385 layoutDirection() == Qt::LeftToRight-
1386 ? QScrollBar::SliderSingleStepAdd : QScrollBar::SliderSingleStepSub);-
1387 break;
never executed: break;
0
1388 default:
never executed: default:
0
1389 e->ignore();-
1390 return;
never executed: return;
0
1391 }-
1392 }-
1393 e->accept();-
1394}
never executed: end of block
0
1395-
1396-
1397#ifndef QT_NO_DRAGANDDROP-
1398/*!-
1399 \fn void QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *event)-
1400-
1401 This event handler can be reimplemented in a subclass to receive-
1402 drag enter events (passed in \a event), for the viewport() widget.-
1403-
1404 \sa QWidget::dragEnterEvent()-
1405*/-
1406void QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *)-
1407{-
1408}-
1409-
1410/*!-
1411 \fn void QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *event)-
1412-
1413 This event handler can be reimplemented in a subclass to receive-
1414 drag move events (passed in \a event), for the viewport() widget.-
1415-
1416 \sa QWidget::dragMoveEvent()-
1417*/-
1418void QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *)-
1419{-
1420}-
1421-
1422/*!-
1423 \fn void QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *event)-
1424-
1425 This event handler can be reimplemented in a subclass to receive-
1426 drag leave events (passed in \a event), for the viewport() widget.-
1427-
1428 \sa QWidget::dragLeaveEvent()-
1429*/-
1430void QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *)-
1431{-
1432}-
1433-
1434/*!-
1435 \fn void QAbstractScrollArea::dropEvent(QDropEvent *event)-
1436-
1437 This event handler can be reimplemented in a subclass to receive-
1438 drop events (passed in \a event), for the viewport() widget.-
1439-
1440 \sa QWidget::dropEvent()-
1441*/-
1442void QAbstractScrollArea::dropEvent(QDropEvent *)-
1443{-
1444}-
1445-
1446-
1447#endif-
1448-
1449/*!-
1450 This virtual handler is called when the scroll bars are moved by-
1451 \a dx, \a dy, and consequently the viewport's contents should be-
1452 scrolled accordingly.-
1453-
1454 The default implementation simply calls update() on the entire-
1455 viewport(), subclasses can reimplement this handler for-
1456 optimization purposes, or - like QScrollArea - to move a contents-
1457 widget. The parameters \a dx and \a dy are there for convenience,-
1458 so that the class knows how much should be scrolled (useful-
1459 e.g. when doing pixel-shifts). You may just as well ignore these-
1460 values and scroll directly to the position the scroll bars-
1461 indicate.-
1462-
1463 Calling this function in order to scroll programmatically is an-
1464 error, use the scroll bars instead (e.g. by calling-
1465 QScrollBar::setValue() directly).-
1466*/-
1467void QAbstractScrollArea::scrollContentsBy(int, int)-
1468{-
1469 viewport()->update();-
1470}
never executed: end of block
0
1471-
1472bool QAbstractScrollAreaPrivate::canStartScrollingAt( const QPoint &startPos )-
1473{-
1474 Q_Q(QAbstractScrollArea);-
1475-
1476#ifndef QT_NO_GRAPHICSVIEW-
1477 // don't start scrolling when a drag mode has been set.-
1478 // don't start scrolling on a movable item.-
1479 if (QGraphicsView *view = qobject_cast<QGraphicsView *>(q)) {
QGraphicsView ...hicsView *>(q)Description
TRUEnever evaluated
FALSEnever evaluated
0
1480 if (view->dragMode() != QGraphicsView::NoDrag)
view->dragMode...csView::NoDragDescription
TRUEnever evaluated
FALSEnever evaluated
0
1481 return false;
never executed: return false;
0
1482-
1483 QGraphicsItem *childItem = view->itemAt(startPos);-
1484-
1485 if (childItem && (childItem->flags() & QGraphicsItem::ItemIsMovable))
childItemDescription
TRUEnever evaluated
FALSEnever evaluated
(childItem->fl...ItemIsMovable)Description
TRUEnever evaluated
FALSEnever evaluated
0
1486 return false;
never executed: return false;
0
1487 }
never executed: end of block
0
1488#endif-
1489-
1490 // don't start scrolling on a QAbstractSlider-
1491 if (qobject_cast<QAbstractSlider *>(q->viewport()->childAt(startPos))) {
qobject_cast<Q...dAt(startPos))Description
TRUEnever evaluated
FALSEnever evaluated
0
1492 return false;
never executed: return false;
0
1493 }-
1494-
1495 return true;
never executed: return true;
0
1496}-
1497-
1498void QAbstractScrollAreaPrivate::flashScrollBars()-
1499{-
1500 bool htransient = hbar->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, hbar);-
1501 if ((hbarpolicy != Qt::ScrollBarAlwaysOff) && (hbarpolicy == Qt::ScrollBarAsNeeded || htransient))
(hbarpolicy !=...lBarAlwaysOff)Description
TRUEnever evaluated
FALSEnever evaluated
hbarpolicy == ...ollBarAsNeededDescription
TRUEnever evaluated
FALSEnever evaluated
htransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
1502 hbar->d_func()->flash();
never executed: hbar->d_func()->flash();
0
1503 bool vtransient = vbar->style()->styleHint(QStyle::SH_ScrollBar_Transient, 0, vbar);-
1504 if ((vbarpolicy != Qt::ScrollBarAlwaysOff) && (vbarpolicy == Qt::ScrollBarAsNeeded || vtransient))
(vbarpolicy !=...lBarAlwaysOff)Description
TRUEnever evaluated
FALSEnever evaluated
vbarpolicy == ...ollBarAsNeededDescription
TRUEnever evaluated
FALSEnever evaluated
vtransientDescription
TRUEnever evaluated
FALSEnever evaluated
0
1505 vbar->d_func()->flash();
never executed: vbar->d_func()->flash();
0
1506}
never executed: end of block
0
1507-
1508void QAbstractScrollAreaPrivate::setScrollBarTransient(QScrollBar *scrollBar, bool transient)-
1509{-
1510 scrollBar->d_func()->setTransient(transient);-
1511}
never executed: end of block
0
1512-
1513void QAbstractScrollAreaPrivate::_q_hslide(int x)-
1514{-
1515 Q_Q(QAbstractScrollArea);-
1516 int dx = xoffset - x;-
1517 xoffset = x;-
1518 q->scrollContentsBy(dx, 0);-
1519 flashScrollBars();-
1520}
never executed: end of block
0
1521-
1522void QAbstractScrollAreaPrivate::_q_vslide(int y)-
1523{-
1524 Q_Q(QAbstractScrollArea);-
1525 int dy = yoffset - y;-
1526 yoffset = y;-
1527 q->scrollContentsBy(0, dy);-
1528 flashScrollBars();-
1529}
never executed: end of block
0
1530-
1531void QAbstractScrollAreaPrivate::_q_showOrHideScrollBars()-
1532{-
1533 layoutChildren();-
1534#ifdef Q_DEAD_CODE_FROM_QT4_WIN-
1535 // Need to re-subscribe to gestures as the content changes to make sure we-
1536 // enable/disable panning when needed.-
1537 QWidgetPrivate *dd = static_cast<QWidgetPrivate *>(QObjectPrivate::get(viewport));-
1538 if (dd)-
1539 dd->winSetupGestures();-
1540#endif // Q_DEAD_CODE_FROM_QT4_WIN-
1541}
never executed: end of block
0
1542-
1543QPoint QAbstractScrollAreaPrivate::contentsOffset() const-
1544{-
1545 Q_Q(const QAbstractScrollArea);-
1546 QPoint offset;-
1547 if (vbar->isVisible())
vbar->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
1548 offset.setY(vbar->value());
never executed: offset.setY(vbar->value());
0
1549 if (hbar->isVisible()) {
hbar->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
1550 if (q->isRightToLeft())
q->isRightToLeft()Description
TRUEnever evaluated
FALSEnever evaluated
0
1551 offset.setX(hbar->maximum() - hbar->value());
never executed: offset.setX(hbar->maximum() - hbar->value());
0
1552 else-
1553 offset.setX(hbar->value());
never executed: offset.setX(hbar->value());
0
1554 }-
1555 return offset;
never executed: return offset;
0
1556}-
1557-
1558/*!-
1559 \reimp-
1560-
1561*/-
1562QSize QAbstractScrollArea::minimumSizeHint() const-
1563{-
1564 Q_D(const QAbstractScrollArea);-
1565 int hsbExt = d->hbar->sizeHint().height();-
1566 int vsbExt = d->vbar->sizeHint().width();-
1567 int extra = 2 * d->frameWidth;-
1568 QStyleOption opt;-
1569 opt.initFrom(this);-
1570 if ((d->frameStyle != QFrame::NoFrame)
(d->frameStyle...rame::NoFrame)Description
TRUEnever evaluated
FALSEnever evaluated
0
1571 && style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &opt, this)) {
style()->style...s, &opt, this)Description
TRUEnever evaluated
FALSEnever evaluated
0
1572 extra += style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &opt, this);-
1573 }
never executed: end of block
0
1574 return QSize(d->scrollBarContainers[Qt::Horizontal]->sizeHint().width() + vsbExt + extra,
never executed: return QSize(d->scrollBarContainers[Qt::Horizontal]->sizeHint().width() + vsbExt + extra, d->scrollBarContainers[Qt::Vertical]->sizeHint().height() + hsbExt + extra);
0
1575 d->scrollBarContainers[Qt::Vertical]->sizeHint().height() + hsbExt + extra);
never executed: return QSize(d->scrollBarContainers[Qt::Horizontal]->sizeHint().width() + vsbExt + extra, d->scrollBarContainers[Qt::Vertical]->sizeHint().height() + hsbExt + extra);
0
1576}-
1577-
1578/*!-
1579 Returns the sizeHint property of the scroll area. The size is determined by using-
1580 viewportSizeHint() plus some extra space for scroll bars, if needed.-
1581 \reimp-
1582*/-
1583QSize QAbstractScrollArea::sizeHint() const-
1584{-
1585 Q_D(const QAbstractScrollArea);-
1586 if (d->sizeAdjustPolicy == QAbstractScrollArea::AdjustIgnored)
d->sizeAdjustP...:AdjustIgnoredDescription
TRUEnever evaluated
FALSEnever evaluated
0
1587 return QSize(256, 192);
never executed: return QSize(256, 192);
0
1588-
1589 if (!d->sizeHint.isValid() || d->sizeAdjustPolicy == QAbstractScrollArea::AdjustToContents) {
!d->sizeHint.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
d->sizeAdjustP...justToContentsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1590 const int f = 2 * d->frameWidth;-
1591 const QSize frame( f, f );-
1592 const QSize scrollbars(d->vbarpolicy == Qt::ScrollBarAlwaysOn ? d->vbar->sizeHint().width() : 0,-
1593 d->hbarpolicy == Qt::ScrollBarAlwaysOn ? d->hbar->sizeHint().height() : 0);-
1594 d->sizeHint = frame + scrollbars + viewportSizeHint();-
1595 }
never executed: end of block
0
1596 return d->sizeHint;
never executed: return d->sizeHint;
0
1597}-
1598-
1599/*!-
1600 \since 5.2-
1601 Returns the recommended size for the viewport.-
1602 The default implementation returns viewport()->sizeHint().-
1603 Note that the size is just the viewport's size, without any scroll bars visible.-
1604 */-
1605QSize QAbstractScrollArea::viewportSizeHint() const-
1606{-
1607 Q_D(const QAbstractScrollArea);-
1608 if (d->viewport) {
d->viewportDescription
TRUEnever evaluated
FALSEnever evaluated
0
1609 const QSize sh = d->viewport->sizeHint();-
1610 if (sh.isValid()) {
sh.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
1611 return sh;
never executed: return sh;
0
1612 }-
1613 }
never executed: end of block
0
1614 const int h = qMax(10, fontMetrics().height());-
1615 return QSize(6 * h, 4 * h);
never executed: return QSize(6 * h, 4 * h);
0
1616}-
1617-
1618/*!-
1619 \since 5.2-
1620 \property QAbstractScrollArea::sizeAdjustPolicy-
1621 This property holds the policy describing how the size of the scroll area changes when the-
1622 size of the viewport changes.-
1623-
1624 The default policy is QAbstractScrollArea::AdjustIgnored.-
1625 Changing this property might actually resize the scrollarea.-
1626*/-
1627-
1628QAbstractScrollArea::SizeAdjustPolicy QAbstractScrollArea::sizeAdjustPolicy() const-
1629{-
1630 Q_D(const QAbstractScrollArea);-
1631 return d->sizeAdjustPolicy;
never executed: return d->sizeAdjustPolicy;
0
1632}-
1633-
1634void QAbstractScrollArea::setSizeAdjustPolicy(SizeAdjustPolicy policy)-
1635{-
1636 Q_D(QAbstractScrollArea);-
1637 if (d->sizeAdjustPolicy == policy)
d->sizeAdjustPolicy == policyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1638 return;
never executed: return;
0
1639-
1640 d->sizeAdjustPolicy = policy;-
1641 d->sizeHint = QSize();-
1642 updateGeometry();-
1643}
never executed: end of block
0
1644-
1645/*!-
1646 This slot is called by QAbstractScrollArea after setViewport(\a-
1647 viewport) has been called. Reimplement this function in a-
1648 subclass of QAbstractScrollArea to initialize the new \a viewport-
1649 before it is used.-
1650-
1651 \sa setViewport()-
1652*/-
1653void QAbstractScrollArea::setupViewport(QWidget *viewport)-
1654{-
1655 Q_UNUSED(viewport);-
1656}
never executed: end of block
0
1657-
1658QT_END_NAMESPACE-
1659-
1660#include "moc_qabstractscrollarea.cpp"-
1661#include "moc_qabstractscrollarea_p.cpp"-
1662-
1663#endif // QT_NO_SCROLLAREA-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9