| Line | Source Code | Coverage |
|---|
| 1 | /**************************************************************************** | - |
| 2 | ** | - |
| 3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
| 4 | ** Contact: http://www.qt-project.org/legal | - |
| 5 | ** | - |
| 6 | ** This file is part of the QtGui 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 Digia. For licensing terms and | - |
| 14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
| 15 | ** use the contact form at http://qt.digia.com/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 as published by the Free Software | - |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
| 21 | ** packaging of this file. Please review the following information to | - |
| 22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
| 23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
| 24 | ** | - |
| 25 | ** In addition, as a special exception, Digia gives you certain additional | - |
| 26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
| 27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
| 28 | ** | - |
| 29 | ** GNU General Public License Usage | - |
| 30 | ** Alternatively, this file may be used under the terms of the GNU | - |
| 31 | ** General Public License version 3.0 as published by the Free Software | - |
| 32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
| 33 | ** packaging of this file. Please review the following information to | - |
| 34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
| 35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
| 36 | ** | - |
| 37 | ** | - |
| 38 | ** $QT_END_LICENSE$ | - |
| 39 | ** | - |
| 40 | ****************************************************************************/ | - |
| 41 | | - |
| 42 | #include "qscrollarea.h" | - |
| 43 | #include "private/qscrollarea_p.h" | - |
| 44 | | - |
| 45 | #ifndef QT_NO_SCROLLAREA | - |
| 46 | | - |
| 47 | #include "qscrollbar.h" | - |
| 48 | #include "qlayout.h" | - |
| 49 | #include "qstyle.h" | - |
| 50 | #include "qapplication.h" | - |
| 51 | #include "qvariant.h" | - |
| 52 | #include "qdebug.h" | - |
| 53 | #include "private/qlayoutengine_p.h" | - |
| 54 | | - |
| 55 | QT_BEGIN_NAMESPACE | - |
| 56 | | - |
| 57 | /*! | - |
| 58 | \class QScrollArea | - |
| 59 | | - |
| 60 | \brief The QScrollArea class provides a scrolling view onto | - |
| 61 | another widget. | - |
| 62 | | - |
| 63 | \ingroup basicwidgets | - |
| 64 | \inmodule QtWidgets | - |
| 65 | | - |
| 66 | A scroll area is used to display the contents of a child widget | - |
| 67 | within a frame. If the widget exceeds the size of the frame, the | - |
| 68 | view can provide scroll bars so that the entire area of the child | - |
| 69 | widget can be viewed. The child widget must be specified with | - |
| 70 | setWidget(). For example: | - |
| 71 | | - |
| 72 | \snippet code/src_gui_widgets_qscrollarea.cpp 0 | - |
| 73 | | - |
| 74 | The code above creates a scroll area (shown in the images below) | - |
| 75 | containing an image label. When scaling the image, the scroll area | - |
| 76 | can provide the necessary scroll bars: | - |
| 77 | | - |
| 78 | \table | - |
| 79 | \row | - |
| 80 | \li \inlineimage qscrollarea-noscrollbars.png | - |
| 81 | \li \inlineimage qscrollarea-onescrollbar.png | - |
| 82 | \li \inlineimage qscrollarea-twoscrollbars.png | - |
| 83 | \endtable | - |
| 84 | | - |
| 85 | The scroll bars appearance depends on the currently set \l | - |
| 86 | {Qt::ScrollBarPolicy}{scroll bar policies}. You can control the | - |
| 87 | appearance of the scroll bars using the inherited functionality | - |
| 88 | from QAbstractScrollArea. | - |
| 89 | | - |
| 90 | For example, you can set the | - |
| 91 | QAbstractScrollArea::horizontalScrollBarPolicy and | - |
| 92 | QAbstractScrollArea::verticalScrollBarPolicy properties. Or if you | - |
| 93 | want the scroll bars to adjust dynamically when the contents of | - |
| 94 | the scroll area changes, you can use the \l | - |
| 95 | {QAbstractScrollArea::horizontalScrollBar()}{horizontalScrollBar()} | - |
| 96 | and \l | - |
| 97 | {QAbstractScrollArea::verticalScrollBar()}{verticalScrollBar()} | - |
| 98 | functions (which enable you to access the scroll bars) and set the | - |
| 99 | scroll bars' values whenever the scroll area's contents change, | - |
| 100 | using the QScrollBar::setValue() function. | - |
| 101 | | - |
| 102 | You can retrieve the child widget using the widget() function. The | - |
| 103 | view can be made to be resizable with the setWidgetResizable() | - |
| 104 | function. The alignment of the widget can be specified with | - |
| 105 | setAlignment(). | - |
| 106 | | - |
| 107 | Two convenience functions ensureVisible() and | - |
| 108 | ensureWidgetVisible() ensure a certain region of the contents is | - |
| 109 | visible inside the viewport, by scrolling the contents if | - |
| 110 | necessary. | - |
| 111 | | - |
| 112 | \section1 Size Hints and Layouts | - |
| 113 | | - |
| 114 | When using a scroll area to display the contents of a custom | - |
| 115 | widget, it is important to ensure that the | - |
| 116 | \l{QWidget::sizeHint}{size hint} of the child widget is set to a | - |
| 117 | suitable value. If a standard QWidget is used for the child | - |
| 118 | widget, it may be necessary to call QWidget::setMinimumSize() to | - |
| 119 | ensure that the contents of the widget are shown correctly within | - |
| 120 | the scroll area. | - |
| 121 | | - |
| 122 | If a scroll area is used to display the contents of a widget that | - |
| 123 | contains child widgets arranged in a layout, it is important to | - |
| 124 | realize that the size policy of the layout will also determine the | - |
| 125 | size of the widget. This is especially useful to know if you intend | - |
| 126 | to dynamically change the contents of the layout. In such cases, | - |
| 127 | setting the layout's \l{QLayout::sizeConstraint}{size constraint} | - |
| 128 | property to one which provides constraints on the minimum and/or | - |
| 129 | maximum size of the layout (e.g., QLayout::SetMinAndMaxSize) will | - |
| 130 | cause the size of the scroll area to be updated whenever the | - |
| 131 | contents of the layout changes. | - |
| 132 | | - |
| 133 | For a complete example using the QScrollArea class, see the \l | - |
| 134 | {widgets/imageviewer}{Image Viewer} example. The example shows how | - |
| 135 | to combine QLabel and QScrollArea to display an image. | - |
| 136 | | - |
| 137 | \sa QAbstractScrollArea, QScrollBar, {Image Viewer Example} | - |
| 138 | */ | - |
| 139 | | - |
| 140 | | - |
| 141 | /*! | - |
| 142 | Constructs an empty scroll area with the given \a parent. | - |
| 143 | | - |
| 144 | \sa setWidget() | - |
| 145 | */ | - |
| 146 | QScrollArea::QScrollArea(QWidget *parent) | - |
| 147 | : QAbstractScrollArea(*new QScrollAreaPrivate,parent) | - |
| 148 | { | - |
| 149 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 150 | d->viewport->setBackgroundRole(QPalette::NoRole); executed (the execution status of this line is deduced): d->viewport->setBackgroundRole(QPalette::NoRole); | - |
| 151 | d->vbar->setSingleStep(20); executed (the execution status of this line is deduced): d->vbar->setSingleStep(20); | - |
| 152 | d->hbar->setSingleStep(20); executed (the execution status of this line is deduced): d->hbar->setSingleStep(20); | - |
| 153 | d->layoutChildren(); executed (the execution status of this line is deduced): d->layoutChildren(); | - |
| 154 | } executed: }Execution Count:39 | 39 |
| 155 | | - |
| 156 | /*! | - |
| 157 | \internal | - |
| 158 | */ | - |
| 159 | QScrollArea::QScrollArea(QScrollAreaPrivate &dd, QWidget *parent) | - |
| 160 | : QAbstractScrollArea(dd, parent) | - |
| 161 | { | - |
| 162 | Q_D(QScrollArea); never executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 163 | d->viewport->setBackgroundRole(QPalette::NoRole); never executed (the execution status of this line is deduced): d->viewport->setBackgroundRole(QPalette::NoRole); | - |
| 164 | d->vbar->setSingleStep(20); never executed (the execution status of this line is deduced): d->vbar->setSingleStep(20); | - |
| 165 | d->hbar->setSingleStep(20); never executed (the execution status of this line is deduced): d->hbar->setSingleStep(20); | - |
| 166 | d->layoutChildren(); never executed (the execution status of this line is deduced): d->layoutChildren(); | - |
| 167 | } | 0 |
| 168 | | - |
| 169 | /*! | - |
| 170 | Destroys the scroll area and its child widget. | - |
| 171 | | - |
| 172 | \sa setWidget() | - |
| 173 | */ | - |
| 174 | QScrollArea::~QScrollArea() | - |
| 175 | { | - |
| 176 | } | - |
| 177 | | - |
| 178 | void QScrollAreaPrivate::updateWidgetPosition() | - |
| 179 | { | - |
| 180 | Q_Q(QScrollArea); executed (the execution status of this line is deduced): QScrollArea * const q = q_func(); | - |
| 181 | Qt::LayoutDirection dir = q->layoutDirection(); executed (the execution status of this line is deduced): Qt::LayoutDirection dir = q->layoutDirection(); | - |
| 182 | QRect scrolled = QStyle::visualRect(dir, viewport->rect(), QRect(QPoint(-hbar->value(), -vbar->value()), widget->size())); executed (the execution status of this line is deduced): QRect scrolled = QStyle::visualRect(dir, viewport->rect(), QRect(QPoint(-hbar->value(), -vbar->value()), widget->size())); | - |
| 183 | QRect aligned = QStyle::alignedRect(dir, alignment, widget->size(), viewport->rect()); executed (the execution status of this line is deduced): QRect aligned = QStyle::alignedRect(dir, alignment, widget->size(), viewport->rect()); | - |
| 184 | widget->move(widget->width() < viewport->width() ? aligned.x() : scrolled.x(), executed (the execution status of this line is deduced): widget->move(widget->width() < viewport->width() ? aligned.x() : scrolled.x(), | - |
| 185 | widget->height() < viewport->height() ? aligned.y() : scrolled.y()); executed (the execution status of this line is deduced): widget->height() < viewport->height() ? aligned.y() : scrolled.y()); | - |
| 186 | } executed: }Execution Count:90 | 90 |
| 187 | | - |
| 188 | void QScrollAreaPrivate::updateScrollBars() | - |
| 189 | { | - |
| 190 | Q_Q(QScrollArea); executed (the execution status of this line is deduced): QScrollArea * const q = q_func(); | - |
| 191 | if (!widget) evaluated: !widget| yes Evaluation Count:15 | yes Evaluation Count:78 |
| 15-78 |
| 192 | return; executed: return;Execution Count:15 | 15 |
| 193 | QSize p = viewport->size(); executed (the execution status of this line is deduced): QSize p = viewport->size(); | - |
| 194 | QSize m = q->maximumViewportSize(); executed (the execution status of this line is deduced): QSize m = q->maximumViewportSize(); | - |
| 195 | | - |
| 196 | QSize min = qSmartMinSize(widget); executed (the execution status of this line is deduced): QSize min = qSmartMinSize(widget); | - |
| 197 | QSize max = qSmartMaxSize(widget); executed (the execution status of this line is deduced): QSize max = qSmartMaxSize(widget); | - |
| 198 | | - |
| 199 | if (resizable) { evaluated: resizable| yes Evaluation Count:27 | yes Evaluation Count:51 |
| 27-51 |
| 200 | if ((widget->layout() ? widget->layout()->hasHeightForWidth() : widget->sizePolicy().hasHeightForWidth())) { partially evaluated: widget->layout()| no Evaluation Count:0 | yes Evaluation Count:27 |
| 0-27 |
| 201 | QSize p_hfw = p.expandedTo(min).boundedTo(max); executed (the execution status of this line is deduced): QSize p_hfw = p.expandedTo(min).boundedTo(max); | - |
| 202 | int h = widget->heightForWidth( p_hfw.width() ); executed (the execution status of this line is deduced): int h = widget->heightForWidth( p_hfw.width() ); | - |
| 203 | min = QSize(p_hfw.width(), qMax(p_hfw.height(), h)); executed (the execution status of this line is deduced): min = QSize(p_hfw.width(), qMax(p_hfw.height(), h)); | - |
| 204 | } executed: }Execution Count:4 | 4 |
| 205 | } executed: }Execution Count:27 | 27 |
| 206 | | - |
| 207 | if ((resizable && m.expandedTo(min) == m && m.boundedTo(max) == m) evaluated: resizable| yes Evaluation Count:27 | yes Evaluation Count:51 |
evaluated: m.expandedTo(min) == m| yes Evaluation Count:25 | yes Evaluation Count:2 |
partially evaluated: m.boundedTo(max) == m| yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-51 |
| 208 | || (!resizable && m.expandedTo(widget->size()) == m)) evaluated: !resizable| yes Evaluation Count:51 | yes Evaluation Count:2 |
evaluated: m.expandedTo(widget->size()) == m| yes Evaluation Count:25 | yes Evaluation Count:26 |
| 2-51 |
| 209 | p = m; // no scroll bars needed executed: p = m;Execution Count:50 | 50 |
| 210 | | - |
| 211 | if (resizable) evaluated: resizable| yes Evaluation Count:27 | yes Evaluation Count:51 |
| 27-51 |
| 212 | widget->resize(p.expandedTo(min).boundedTo(max)); executed: widget->resize(p.expandedTo(min).boundedTo(max));Execution Count:27 | 27 |
| 213 | QSize v = widget->size(); executed (the execution status of this line is deduced): QSize v = widget->size(); | - |
| 214 | | - |
| 215 | hbar->setRange(0, v.width() - p.width()); executed (the execution status of this line is deduced): hbar->setRange(0, v.width() - p.width()); | - |
| 216 | hbar->setPageStep(p.width()); executed (the execution status of this line is deduced): hbar->setPageStep(p.width()); | - |
| 217 | vbar->setRange(0, v.height() - p.height()); executed (the execution status of this line is deduced): vbar->setRange(0, v.height() - p.height()); | - |
| 218 | vbar->setPageStep(p.height()); executed (the execution status of this line is deduced): vbar->setPageStep(p.height()); | - |
| 219 | updateWidgetPosition(); executed (the execution status of this line is deduced): updateWidgetPosition(); | - |
| 220 | | - |
| 221 | } executed: }Execution Count:78 | 78 |
| 222 | | - |
| 223 | /*! | - |
| 224 | Returns the scroll area's widget, or 0 if there is none. | - |
| 225 | | - |
| 226 | \sa setWidget() | - |
| 227 | */ | - |
| 228 | | - |
| 229 | QWidget *QScrollArea::widget() const | - |
| 230 | { | - |
| 231 | Q_D(const QScrollArea); executed (the execution status of this line is deduced): const QScrollAreaPrivate * const d = d_func(); | - |
| 232 | return d->widget; executed: return d->widget;Execution Count:2 | 2 |
| 233 | } | - |
| 234 | | - |
| 235 | /*! | - |
| 236 | \fn void QScrollArea::setWidget(QWidget *widget) | - |
| 237 | | - |
| 238 | Sets the scroll area's \a widget. | - |
| 239 | | - |
| 240 | The \a widget becomes a child of the scroll area, and will be | - |
| 241 | destroyed when the scroll area is deleted or when a new widget is | - |
| 242 | set. | - |
| 243 | | - |
| 244 | The widget's \l{QWidget::setAutoFillBackground()}{autoFillBackground} | - |
| 245 | property will be set to \c{true}. | - |
| 246 | | - |
| 247 | If the scroll area is visible when the \a widget is | - |
| 248 | added, you must \l{QWidget::}{show()} it explicitly. | - |
| 249 | | - |
| 250 | Note that You must add the layout of \a widget before you call | - |
| 251 | this function; if you add it later, the \a widget will not be | - |
| 252 | visible - regardless of when you \l{QWidget::}{show()} the scroll | - |
| 253 | area. In this case, you can also not \l{QWidget::}{show()} the \a | - |
| 254 | widget later. | - |
| 255 | | - |
| 256 | \sa widget() | - |
| 257 | */ | - |
| 258 | void QScrollArea::setWidget(QWidget *widget) | - |
| 259 | { | - |
| 260 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 261 | if (widget == d->widget || !widget) partially evaluated: widget == d->widget| no Evaluation Count:0 | yes Evaluation Count:32 |
evaluated: !widget| yes Evaluation Count:1 | yes Evaluation Count:31 |
| 0-32 |
| 262 | return; executed: return;Execution Count:1 | 1 |
| 263 | | - |
| 264 | delete d->widget; executed (the execution status of this line is deduced): delete d->widget; | - |
| 265 | d->widget = 0; executed (the execution status of this line is deduced): d->widget = 0; | - |
| 266 | d->hbar->setValue(0); executed (the execution status of this line is deduced): d->hbar->setValue(0); | - |
| 267 | d->vbar->setValue(0); executed (the execution status of this line is deduced): d->vbar->setValue(0); | - |
| 268 | if (widget->parentWidget() != d->viewport) partially evaluated: widget->parentWidget() != d->viewport| yes Evaluation Count:31 | no Evaluation Count:0 |
| 0-31 |
| 269 | widget->setParent(d->viewport); executed: widget->setParent(d->viewport);Execution Count:31 | 31 |
| 270 | if (!widget->testAttribute(Qt::WA_Resized)) evaluated: !widget->testAttribute(Qt::WA_Resized)| yes Evaluation Count:24 | yes Evaluation Count:7 |
| 7-24 |
| 271 | widget->resize(widget->sizeHint()); executed: widget->resize(widget->sizeHint());Execution Count:24 | 24 |
| 272 | d->widget = widget; executed (the execution status of this line is deduced): d->widget = widget; | - |
| 273 | d->widget->setAutoFillBackground(true); executed (the execution status of this line is deduced): d->widget->setAutoFillBackground(true); | - |
| 274 | widget->installEventFilter(this); executed (the execution status of this line is deduced): widget->installEventFilter(this); | - |
| 275 | d->widgetSize = QSize(); executed (the execution status of this line is deduced): d->widgetSize = QSize(); | - |
| 276 | d->updateScrollBars(); executed (the execution status of this line is deduced): d->updateScrollBars(); | - |
| 277 | d->widget->show(); executed (the execution status of this line is deduced): d->widget->show(); | - |
| 278 | | - |
| 279 | } executed: }Execution Count:31 | 31 |
| 280 | | - |
| 281 | /*! | - |
| 282 | Removes the scroll area's widget, and passes ownership of the | - |
| 283 | widget to the caller. | - |
| 284 | | - |
| 285 | \sa widget() | - |
| 286 | */ | - |
| 287 | QWidget *QScrollArea::takeWidget() | - |
| 288 | { | - |
| 289 | Q_D(QScrollArea); never executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 290 | QWidget *w = d->widget; never executed (the execution status of this line is deduced): QWidget *w = d->widget; | - |
| 291 | d->widget = 0; never executed (the execution status of this line is deduced): d->widget = 0; | - |
| 292 | if (w) | 0 |
| 293 | w->setParent(0); never executed: w->setParent(0); | 0 |
| 294 | return w; never executed: return w; | 0 |
| 295 | } | - |
| 296 | | - |
| 297 | /*! | - |
| 298 | \reimp | - |
| 299 | */ | - |
| 300 | bool QScrollArea::event(QEvent *e) | - |
| 301 | { | - |
| 302 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 303 | if (e->type() == QEvent::StyleChange || e->type() == QEvent::LayoutRequest) { evaluated: e->type() == QEvent::StyleChange| yes Evaluation Count:2 | yes Evaluation Count:358 |
evaluated: e->type() == QEvent::LayoutRequest| yes Evaluation Count:1 | yes Evaluation Count:357 |
| 1-358 |
| 304 | d->updateScrollBars(); executed (the execution status of this line is deduced): d->updateScrollBars(); | - |
| 305 | } executed: }Execution Count:3 | 3 |
| 306 | #ifdef QT_KEYPAD_NAVIGATION | - |
| 307 | else if (QApplication::keypadNavigationEnabled()) { | - |
| 308 | if (e->type() == QEvent::Show) | - |
| 309 | QApplication::instance()->installEventFilter(this); | - |
| 310 | else if (e->type() == QEvent::Hide) | - |
| 311 | QApplication::instance()->removeEventFilter(this); | - |
| 312 | } | - |
| 313 | #endif | - |
| 314 | return QAbstractScrollArea::event(e); executed: return QAbstractScrollArea::event(e);Execution Count:360 | 360 |
| 315 | } | - |
| 316 | | - |
| 317 | | - |
| 318 | /*! | - |
| 319 | \reimp | - |
| 320 | */ | - |
| 321 | bool QScrollArea::eventFilter(QObject *o, QEvent *e) | - |
| 322 | { | - |
| 323 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 324 | #ifdef QT_KEYPAD_NAVIGATION | - |
| 325 | if (d->widget && o != d->widget && e->type() == QEvent::FocusIn | - |
| 326 | && QApplication::keypadNavigationEnabled()) { | - |
| 327 | if (o->isWidgetType()) | - |
| 328 | ensureWidgetVisible(static_cast<QWidget *>(o)); | - |
| 329 | } | - |
| 330 | #endif | - |
| 331 | if (o == d->widget && e->type() == QEvent::Resize) evaluated: o == d->widget| yes Evaluation Count:121 | yes Evaluation Count:106 |
evaluated: e->type() == QEvent::Resize| yes Evaluation Count:10 | yes Evaluation Count:111 |
| 10-121 |
| 332 | d->updateScrollBars(); executed: d->updateScrollBars();Execution Count:10 | 10 |
| 333 | | - |
| 334 | return QAbstractScrollArea::eventFilter(o, e); executed: return QAbstractScrollArea::eventFilter(o, e);Execution Count:227 | 227 |
| 335 | } | - |
| 336 | | - |
| 337 | /*! | - |
| 338 | \reimp | - |
| 339 | */ | - |
| 340 | void QScrollArea::resizeEvent(QResizeEvent *) | - |
| 341 | { | - |
| 342 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 343 | d->updateScrollBars(); executed (the execution status of this line is deduced): d->updateScrollBars(); | - |
| 344 | | - |
| 345 | } executed: }Execution Count:23 | 23 |
| 346 | | - |
| 347 | | - |
| 348 | /*!\reimp | - |
| 349 | */ | - |
| 350 | void QScrollArea::scrollContentsBy(int, int) | - |
| 351 | { | - |
| 352 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 353 | if (!d->widget) evaluated: !d->widget| yes Evaluation Count:2 | yes Evaluation Count:12 |
| 2-12 |
| 354 | return; executed: return;Execution Count:2 | 2 |
| 355 | d->updateWidgetPosition(); executed (the execution status of this line is deduced): d->updateWidgetPosition(); | - |
| 356 | } executed: }Execution Count:12 | 12 |
| 357 | | - |
| 358 | | - |
| 359 | /*! | - |
| 360 | \property QScrollArea::widgetResizable | - |
| 361 | \brief whether the scroll area should resize the view widget | - |
| 362 | | - |
| 363 | If this property is set to false (the default), the scroll area | - |
| 364 | honors the size of its widget. Regardless of this property, you | - |
| 365 | can programmatically resize the widget using widget()->resize(), | - |
| 366 | and the scroll area will automatically adjust itself to the new | - |
| 367 | size. | - |
| 368 | | - |
| 369 | If this property is set to true, the scroll area will | - |
| 370 | automatically resize the widget in order to avoid scroll bars | - |
| 371 | where they can be avoided, or to take advantage of extra space. | - |
| 372 | */ | - |
| 373 | bool QScrollArea::widgetResizable() const | - |
| 374 | { | - |
| 375 | Q_D(const QScrollArea); executed (the execution status of this line is deduced): const QScrollAreaPrivate * const d = d_func(); | - |
| 376 | return d->resizable; executed: return d->resizable;Execution Count:2 | 2 |
| 377 | } | - |
| 378 | | - |
| 379 | void QScrollArea::setWidgetResizable(bool resizable) | - |
| 380 | { | - |
| 381 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 382 | d->resizable = resizable; executed (the execution status of this line is deduced): d->resizable = resizable; | - |
| 383 | updateGeometry(); executed (the execution status of this line is deduced): updateGeometry(); | - |
| 384 | d->updateScrollBars(); executed (the execution status of this line is deduced): d->updateScrollBars(); | - |
| 385 | } executed: }Execution Count:26 | 26 |
| 386 | | - |
| 387 | /*! | - |
| 388 | \reimp | - |
| 389 | */ | - |
| 390 | QSize QScrollArea::sizeHint() const | - |
| 391 | { | - |
| 392 | Q_D(const QScrollArea); executed (the execution status of this line is deduced): const QScrollAreaPrivate * const d = d_func(); | - |
| 393 | int f = 2 * d->frameWidth; executed (the execution status of this line is deduced): int f = 2 * d->frameWidth; | - |
| 394 | QSize sz(f, f); executed (the execution status of this line is deduced): QSize sz(f, f); | - |
| 395 | int h = fontMetrics().height(); executed (the execution status of this line is deduced): int h = fontMetrics().height(); | - |
| 396 | if (d->widget) { partially evaluated: d->widget| no Evaluation Count:0 | yes Evaluation Count:40 |
| 0-40 |
| 397 | if (!d->widgetSize.isValid()) never evaluated: !d->widgetSize.isValid() | 0 |
| 398 | d->widgetSize = d->resizable ? d->widget->sizeHint() : d->widget->size(); never executed: d->widgetSize = d->resizable ? d->widget->sizeHint() : d->widget->size(); never evaluated: d->resizable | 0 |
| 399 | sz += d->widgetSize; never executed (the execution status of this line is deduced): sz += d->widgetSize; | - |
| 400 | } else { | 0 |
| 401 | sz += QSize(12 * h, 8 * h); executed (the execution status of this line is deduced): sz += QSize(12 * h, 8 * h); | - |
| 402 | } executed: }Execution Count:40 | 40 |
| 403 | if (d->vbarpolicy == Qt::ScrollBarAlwaysOn) partially evaluated: d->vbarpolicy == Qt::ScrollBarAlwaysOn| no Evaluation Count:0 | yes Evaluation Count:40 |
| 0-40 |
| 404 | sz.setWidth(sz.width() + d->vbar->sizeHint().width()); never executed: sz.setWidth(sz.width() + d->vbar->sizeHint().width()); | 0 |
| 405 | if (d->hbarpolicy == Qt::ScrollBarAlwaysOn) partially evaluated: d->hbarpolicy == Qt::ScrollBarAlwaysOn| no Evaluation Count:0 | yes Evaluation Count:40 |
| 0-40 |
| 406 | sz.setHeight(sz.height() + d->hbar->sizeHint().height()); never executed: sz.setHeight(sz.height() + d->hbar->sizeHint().height()); | 0 |
| 407 | return sz.boundedTo(QSize(36 * h, 24 * h)); executed: return sz.boundedTo(QSize(36 * h, 24 * h));Execution Count:40 | 40 |
| 408 | } | - |
| 409 | | - |
| 410 | | - |
| 411 | | - |
| 412 | /*! | - |
| 413 | \reimp | - |
| 414 | */ | - |
| 415 | bool QScrollArea::focusNextPrevChild(bool next) | - |
| 416 | { | - |
| 417 | if (QWidget::focusNextPrevChild(next)) { never evaluated: QWidget::focusNextPrevChild(next) | 0 |
| 418 | if (QWidget *fw = focusWidget()) never evaluated: QWidget *fw = focusWidget() | 0 |
| 419 | ensureWidgetVisible(fw); never executed: ensureWidgetVisible(fw); | 0 |
| 420 | return true; never executed: return true; | 0 |
| 421 | } | - |
| 422 | return false; never executed: return false; | 0 |
| 423 | } | - |
| 424 | | - |
| 425 | /*! | - |
| 426 | Scrolls the contents of the scroll area so that the point (\a x, \a y) is visible | - |
| 427 | inside the region of the viewport with margins specified in pixels by \a xmargin and | - |
| 428 | \a ymargin. If the specified point cannot be reached, the contents are scrolled to | - |
| 429 | the nearest valid position. The default value for both margins is 50 pixels. | - |
| 430 | */ | - |
| 431 | void QScrollArea::ensureVisible(int x, int y, int xmargin, int ymargin) | - |
| 432 | { | - |
| 433 | Q_D(QScrollArea); never executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 434 | | - |
| 435 | int logicalX = QStyle::visualPos(layoutDirection(), d->viewport->rect(), QPoint(x, y)).x(); never executed (the execution status of this line is deduced): int logicalX = QStyle::visualPos(layoutDirection(), d->viewport->rect(), QPoint(x, y)).x(); | - |
| 436 | | - |
| 437 | if (logicalX - xmargin < d->hbar->value()) { never evaluated: logicalX - xmargin < d->hbar->value() | 0 |
| 438 | d->hbar->setValue(qMax(0, logicalX - xmargin)); never executed (the execution status of this line is deduced): d->hbar->setValue(qMax(0, logicalX - xmargin)); | - |
| 439 | } else if (logicalX > d->hbar->value() + d->viewport->width() - xmargin) { never executed: } never evaluated: logicalX > d->hbar->value() + d->viewport->width() - xmargin | 0 |
| 440 | d->hbar->setValue(qMin(logicalX - d->viewport->width() + xmargin, d->hbar->maximum())); never executed (the execution status of this line is deduced): d->hbar->setValue(qMin(logicalX - d->viewport->width() + xmargin, d->hbar->maximum())); | - |
| 441 | } | 0 |
| 442 | | - |
| 443 | if (y - ymargin < d->vbar->value()) { never evaluated: y - ymargin < d->vbar->value() | 0 |
| 444 | d->vbar->setValue(qMax(0, y - ymargin)); never executed (the execution status of this line is deduced): d->vbar->setValue(qMax(0, y - ymargin)); | - |
| 445 | } else if (y > d->vbar->value() + d->viewport->height() - ymargin) { never executed: } never evaluated: y > d->vbar->value() + d->viewport->height() - ymargin | 0 |
| 446 | d->vbar->setValue(qMin(y - d->viewport->height() + ymargin, d->vbar->maximum())); never executed (the execution status of this line is deduced): d->vbar->setValue(qMin(y - d->viewport->height() + ymargin, d->vbar->maximum())); | - |
| 447 | } | 0 |
| 448 | } | - |
| 449 | | - |
| 450 | /*! | - |
| 451 | \since 4.2 | - |
| 452 | | - |
| 453 | Scrolls the contents of the scroll area so that the \a childWidget | - |
| 454 | of QScrollArea::widget() is visible inside the viewport with | - |
| 455 | margins specified in pixels by \a xmargin and \a ymargin. If the | - |
| 456 | specified point cannot be reached, the contents are scrolled to | - |
| 457 | the nearest valid position. The default value for both margins is | - |
| 458 | 50 pixels. | - |
| 459 | | - |
| 460 | */ | - |
| 461 | void QScrollArea::ensureWidgetVisible(QWidget *childWidget, int xmargin, int ymargin) | - |
| 462 | { | - |
| 463 | Q_D(QScrollArea); executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 464 | | - |
| 465 | if (!d->widget->isAncestorOf(childWidget)) partially evaluated: !d->widget->isAncestorOf(childWidget)| no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
| 466 | return; | 0 |
| 467 | | - |
| 468 | const QRect microFocus = childWidget->inputMethodQuery(Qt::ImCursorRectangle).toRect(); executed (the execution status of this line is deduced): const QRect microFocus = childWidget->inputMethodQuery(Qt::ImCursorRectangle).toRect(); | - |
| 469 | const QRect defaultMicroFocus = executed (the execution status of this line is deduced): const QRect defaultMicroFocus = | - |
| 470 | childWidget->QWidget::inputMethodQuery(Qt::ImCursorRectangle).toRect(); executed (the execution status of this line is deduced): childWidget->QWidget::inputMethodQuery(Qt::ImCursorRectangle).toRect(); | - |
| 471 | QRect focusRect = (microFocus != defaultMicroFocus) partially evaluated: (microFocus != defaultMicroFocus)| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 472 | ? QRect(childWidget->mapTo(d->widget, microFocus.topLeft()), microFocus.size()) executed (the execution status of this line is deduced): ? QRect(childWidget->mapTo(d->widget, microFocus.topLeft()), microFocus.size()) | - |
| 473 | : QRect(childWidget->mapTo(d->widget, QPoint(0,0)), childWidget->size()); executed (the execution status of this line is deduced): : QRect(childWidget->mapTo(d->widget, QPoint(0,0)), childWidget->size()); | - |
| 474 | const QRect visibleRect(-d->widget->pos(), d->viewport->size()); executed (the execution status of this line is deduced): const QRect visibleRect(-d->widget->pos(), d->viewport->size()); | - |
| 475 | | - |
| 476 | if (visibleRect.contains(focusRect)) partially evaluated: visibleRect.contains(focusRect)| no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
| 477 | return; | 0 |
| 478 | | - |
| 479 | focusRect.adjust(-xmargin, -ymargin, xmargin, ymargin); executed (the execution status of this line is deduced): focusRect.adjust(-xmargin, -ymargin, xmargin, ymargin); | - |
| 480 | | - |
| 481 | if (focusRect.width() > visibleRect.width()) partially evaluated: focusRect.width() > visibleRect.width()| no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
| 482 | d->hbar->setValue(focusRect.center().x() - d->viewport->width() / 2); never executed: d->hbar->setValue(focusRect.center().x() - d->viewport->width() / 2); | 0 |
| 483 | else if (focusRect.right() > visibleRect.right()) partially evaluated: focusRect.right() > visibleRect.right()| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 484 | d->hbar->setValue(focusRect.right() - d->viewport->width()); executed: d->hbar->setValue(focusRect.right() - d->viewport->width());Execution Count:1 | 1 |
| 485 | else if (focusRect.left() < visibleRect.left()) never evaluated: focusRect.left() < visibleRect.left() | 0 |
| 486 | d->hbar->setValue(focusRect.left()); never executed: d->hbar->setValue(focusRect.left()); | 0 |
| 487 | | - |
| 488 | if (focusRect.height() > visibleRect.height()) partially evaluated: focusRect.height() > visibleRect.height()| no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
| 489 | d->vbar->setValue(focusRect.center().y() - d->viewport->height() / 2); never executed: d->vbar->setValue(focusRect.center().y() - d->viewport->height() / 2); | 0 |
| 490 | else if (focusRect.bottom() > visibleRect.bottom()) partially evaluated: focusRect.bottom() > visibleRect.bottom()| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 491 | d->vbar->setValue(focusRect.bottom() - d->viewport->height()); executed: d->vbar->setValue(focusRect.bottom() - d->viewport->height());Execution Count:1 | 1 |
| 492 | else if (focusRect.top() < visibleRect.top()) never evaluated: focusRect.top() < visibleRect.top() | 0 |
| 493 | d->vbar->setValue(focusRect.top()); never executed: d->vbar->setValue(focusRect.top()); | 0 |
| 494 | } | - |
| 495 | | - |
| 496 | | - |
| 497 | /*! | - |
| 498 | \property QScrollArea::alignment | - |
| 499 | \brief the alignment of the scroll area's widget | - |
| 500 | \since 4.2 | - |
| 501 | | - |
| 502 | By default, the widget stays rooted to the top-left corner of the | - |
| 503 | scroll area. | - |
| 504 | */ | - |
| 505 | | - |
| 506 | void QScrollArea::setAlignment(Qt::Alignment alignment) | - |
| 507 | { | - |
| 508 | Q_D(QScrollArea); never executed (the execution status of this line is deduced): QScrollAreaPrivate * const d = d_func(); | - |
| 509 | d->alignment = alignment; never executed (the execution status of this line is deduced): d->alignment = alignment; | - |
| 510 | if (d->widget) never evaluated: d->widget | 0 |
| 511 | d->updateWidgetPosition(); never executed: d->updateWidgetPosition(); | 0 |
| 512 | } | 0 |
| 513 | | - |
| 514 | Qt::Alignment QScrollArea::alignment() const | - |
| 515 | { | - |
| 516 | Q_D(const QScrollArea); never executed (the execution status of this line is deduced): const QScrollAreaPrivate * const d = d_func(); | - |
| 517 | return d->alignment; never executed: return d->alignment; | 0 |
| 518 | } | - |
| 519 | | - |
| 520 | QT_END_NAMESPACE | - |
| 521 | | - |
| 522 | #endif // QT_NO_SCROLLAREA | - |
| 523 | | - |
| | |