|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the QtGui module of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 #include "qtabwidget.h" |
|
43 |
|
44 #ifndef QT_NO_TABWIDGET |
|
45 #include "private/qwidget_p.h" |
|
46 #include "private/qtabbar_p.h" |
|
47 #include "qapplication.h" |
|
48 #include "qbitmap.h" |
|
49 #include "qdesktopwidget.h" |
|
50 #include "qevent.h" |
|
51 #include "qlayout.h" |
|
52 #include "qstackedwidget.h" |
|
53 #include "qstyle.h" |
|
54 #include "qstyleoption.h" |
|
55 #include "qstylepainter.h" |
|
56 #include "qtabbar.h" |
|
57 #include "qtoolbutton.h" |
|
58 |
|
59 QT_BEGIN_NAMESPACE |
|
60 |
|
61 /*! |
|
62 \class QTabWidget |
|
63 \brief The QTabWidget class provides a stack of tabbed widgets. |
|
64 |
|
65 \ingroup organizers |
|
66 \ingroup basicwidgets |
|
67 |
|
68 |
|
69 A tab widget provides a tab bar (see QTabBar) and a "page area" |
|
70 that is used to display pages related to each tab. By default, the |
|
71 tab bar is shown above the page area, but different configurations |
|
72 are available (see \l{TabPosition}). Each tab is associated with a |
|
73 different widget (called a page). Only the current page is shown in |
|
74 the page area; all the other pages are hidden. The user can show a |
|
75 different page by clicking on its tab or by pressing its |
|
76 Alt+\e{letter} shortcut if it has one. |
|
77 |
|
78 The normal way to use QTabWidget is to do the following: |
|
79 \list 1 |
|
80 \i Create a QTabWidget. |
|
81 \i Create a QWidget for each of the pages in the tab dialog, but |
|
82 do not specify parent widgets for them. |
|
83 \i Insert child widgets into the page widget, using layouts to |
|
84 position them as normal. |
|
85 \i Call addTab() or insertTab() to put the page widgets into the |
|
86 tab widget, giving each tab a suitable label with an optional |
|
87 keyboard shortcut. |
|
88 \endlist |
|
89 |
|
90 The position of the tabs is defined by \l tabPosition, their shape |
|
91 by \l tabShape. |
|
92 |
|
93 The signal currentChanged() is emitted when the user selects a |
|
94 page. |
|
95 |
|
96 The current page index is available as currentIndex(), the current |
|
97 page widget with currentWidget(). You can retrieve a pointer to a |
|
98 page widget with a given index using widget(), and can find the |
|
99 index position of a widget with indexOf(). Use setCurrentWidget() |
|
100 or setCurrentIndex() to show a particular page. |
|
101 |
|
102 You can change a tab's text and icon using setTabText() or |
|
103 setTabIcon(). A tab and its associated page can be removed with |
|
104 removeTab(). |
|
105 |
|
106 Each tab is either enabled or disabled at any given time (see |
|
107 setTabEnabled()). If a tab is enabled, the tab text is drawn |
|
108 normally and the user can select that tab. If it is disabled, the |
|
109 tab is drawn in a different way and the user cannot select that |
|
110 tab. Note that even if a tab is disabled, the page can still be |
|
111 visible, for example if all of the tabs happen to be disabled. |
|
112 |
|
113 Tab widgets can be a very good way to split up a complex dialog. |
|
114 An alternative is to use a QStackedWidget for which you provide some |
|
115 means of navigating between pages, for example, a QToolBar or a |
|
116 QListWidget. |
|
117 |
|
118 Most of the functionality in QTabWidget is provided by a QTabBar |
|
119 (at the top, providing the tabs) and a QStackedWidget (most of the |
|
120 area, organizing the individual pages). |
|
121 |
|
122 \table 100% |
|
123 \row \o \inlineimage windowsxp-tabwidget.png Screenshot of a Windows XP style tab widget |
|
124 \o \inlineimage macintosh-tabwidget.png Screenshot of a Macintosh style tab widget |
|
125 \o \inlineimage plastique-tabwidget.png Screenshot of a Plastique style tab widget |
|
126 \row \o A Windows XP style tab widget. |
|
127 \o A Macintosh style tab widget. |
|
128 \o A Plastique style tab widget. |
|
129 \endtable |
|
130 |
|
131 \sa QTabBar, QStackedWidget, QToolBox, {Tab Dialog Example} |
|
132 */ |
|
133 |
|
134 /*! |
|
135 \enum QTabWidget::TabPosition |
|
136 |
|
137 This enum type defines where QTabWidget draws the tab row: |
|
138 |
|
139 \value North The tabs are drawn above the pages. |
|
140 \value South The tabs are drawn below the pages. |
|
141 \value West The tabs are drawn to the left of the pages. |
|
142 \value East The tabs are drawn to the right of the pages. |
|
143 \omitvalue Bottom |
|
144 \omitvalue Top |
|
145 */ |
|
146 |
|
147 /*! |
|
148 \enum QTabWidget::TabShape |
|
149 |
|
150 This enum type defines the shape of the tabs: |
|
151 \value Rounded The tabs are drawn with a rounded look. This is the default |
|
152 shape. |
|
153 \value Triangular The tabs are drawn with a triangular look. |
|
154 */ |
|
155 |
|
156 /*! |
|
157 \fn void QTabWidget::selected(const QString &tabLabel) |
|
158 |
|
159 This signal is emitted whenever a tab is selected (raised), |
|
160 including during the first show(). |
|
161 |
|
162 You can normally use currentChanged() instead. |
|
163 */ |
|
164 |
|
165 /*! |
|
166 \fn void QTabWidget::currentChanged(int index) |
|
167 |
|
168 This signal is emitted whenever the current page index changes. |
|
169 The parameter is the new current page \a index position, or -1 |
|
170 if there isn't a new one (for example, if there are no widgets |
|
171 in the QTabWidget) |
|
172 |
|
173 \sa currentWidget() currentIndex |
|
174 */ |
|
175 |
|
176 /*! |
|
177 \fn void QTabWidget::tabCloseRequested(int index) |
|
178 \since 4.5 |
|
179 |
|
180 This signal is emitted when the close button on a tab is clicked. |
|
181 The \a index is the index that should be removed. |
|
182 |
|
183 \sa setTabsClosable() |
|
184 */ |
|
185 |
|
186 class QTabWidgetPrivate : public QWidgetPrivate |
|
187 { |
|
188 Q_DECLARE_PUBLIC(QTabWidget) |
|
189 |
|
190 public: |
|
191 QTabWidgetPrivate(); |
|
192 ~QTabWidgetPrivate(); |
|
193 void updateTabBarPosition(); |
|
194 void _q_showTab(int); |
|
195 void _q_removeTab(int); |
|
196 void _q_tabMoved(int from, int to); |
|
197 void init(); |
|
198 |
|
199 QTabBar *tabs; |
|
200 QStackedWidget *stack; |
|
201 QRect panelRect; |
|
202 bool dirty; |
|
203 QTabWidget::TabPosition pos; |
|
204 QTabWidget::TabShape shape; |
|
205 int alignment; |
|
206 QWidget *leftCornerWidget; |
|
207 QWidget *rightCornerWidget; |
|
208 }; |
|
209 |
|
210 QTabWidgetPrivate::QTabWidgetPrivate() |
|
211 : tabs(0), stack(0), dirty(true), |
|
212 pos(QTabWidget::North), shape(QTabWidget::Rounded), |
|
213 leftCornerWidget(0), rightCornerWidget(0) |
|
214 {} |
|
215 |
|
216 QTabWidgetPrivate::~QTabWidgetPrivate() |
|
217 {} |
|
218 |
|
219 void QTabWidgetPrivate::init() |
|
220 { |
|
221 Q_Q(QTabWidget); |
|
222 |
|
223 stack = new QStackedWidget(q); |
|
224 stack->setObjectName(QLatin1String("qt_tabwidget_stackedwidget")); |
|
225 stack->setLineWidth(0); |
|
226 // hack so that QMacStyle::layoutSpacing() can detect tab widget pages |
|
227 stack->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, QSizePolicy::TabWidget)); |
|
228 |
|
229 QObject::connect(stack, SIGNAL(widgetRemoved(int)), q, SLOT(_q_removeTab(int))); |
|
230 QTabBar *tabBar = new QTabBar(q); |
|
231 tabBar->setObjectName(QLatin1String("qt_tabwidget_tabbar")); |
|
232 tabBar->setDrawBase(false); |
|
233 q->setTabBar(tabBar); |
|
234 |
|
235 q->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding, |
|
236 QSizePolicy::TabWidget)); |
|
237 #ifdef QT_KEYPAD_NAVIGATION |
|
238 if (QApplication::keypadNavigationEnabled()) |
|
239 q->setFocusPolicy(Qt::NoFocus); |
|
240 else |
|
241 #endif |
|
242 q->setFocusPolicy(Qt::TabFocus); |
|
243 q->setFocusProxy(tabs); |
|
244 q->setTabPosition(static_cast<QTabWidget::TabPosition> (q->style()->styleHint( |
|
245 QStyle::SH_TabWidget_DefaultTabPosition, 0, q ))); |
|
246 |
|
247 } |
|
248 |
|
249 /*! |
|
250 Initialize \a option with the values from this QTabWidget. This method is useful |
|
251 for subclasses when they need a QStyleOptionTabWidgetFrame, but don't want to fill |
|
252 in all the information themselves. |
|
253 |
|
254 \sa QStyleOption::initFrom() QTabBar::initStyleOption() |
|
255 */ |
|
256 void QTabWidget::initStyleOption(QStyleOptionTabWidgetFrame *option) const |
|
257 { |
|
258 if (!option) |
|
259 return; |
|
260 |
|
261 Q_D(const QTabWidget); |
|
262 option->initFrom(this); |
|
263 |
|
264 if (documentMode()) |
|
265 option->lineWidth = 0; |
|
266 else |
|
267 option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this); |
|
268 |
|
269 int exth = style()->pixelMetric(QStyle::PM_TabBarBaseHeight, 0, this); |
|
270 QSize t(0, d->stack->frameWidth()); |
|
271 if (d->tabs->isVisibleTo(const_cast<QTabWidget *>(this))) { |
|
272 t = d->tabs->sizeHint(); |
|
273 if (documentMode()) { |
|
274 if (tabPosition() == East || tabPosition() == West) { |
|
275 t.setHeight(height()); |
|
276 } else { |
|
277 t.setWidth(width()); |
|
278 } |
|
279 } |
|
280 } |
|
281 |
|
282 if (d->rightCornerWidget) { |
|
283 const QSize rightCornerSizeHint = d->rightCornerWidget->sizeHint(); |
|
284 const QSize bounds(rightCornerSizeHint.width(), t.height() - exth); |
|
285 option->rightCornerWidgetSize = rightCornerSizeHint.boundedTo(bounds); |
|
286 } else { |
|
287 option->rightCornerWidgetSize = QSize(0, 0); |
|
288 } |
|
289 |
|
290 if (d->leftCornerWidget) { |
|
291 const QSize leftCornerSizeHint = d->leftCornerWidget->sizeHint(); |
|
292 const QSize bounds(leftCornerSizeHint.width(), t.height() - exth); |
|
293 option->leftCornerWidgetSize = leftCornerSizeHint.boundedTo(bounds); |
|
294 } else { |
|
295 option->leftCornerWidgetSize = QSize(0, 0); |
|
296 } |
|
297 |
|
298 switch (d->pos) { |
|
299 case QTabWidget::North: |
|
300 option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedNorth |
|
301 : QTabBar::TriangularNorth; |
|
302 break; |
|
303 case QTabWidget::South: |
|
304 option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedSouth |
|
305 : QTabBar::TriangularSouth; |
|
306 break; |
|
307 case QTabWidget::West: |
|
308 option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedWest |
|
309 : QTabBar::TriangularWest; |
|
310 break; |
|
311 case QTabWidget::East: |
|
312 option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedEast |
|
313 : QTabBar::TriangularEast; |
|
314 break; |
|
315 } |
|
316 option->tabBarSize = t; |
|
317 } |
|
318 |
|
319 /*! |
|
320 Constructs a tabbed widget with parent \a parent. |
|
321 */ |
|
322 QTabWidget::QTabWidget(QWidget *parent) |
|
323 : QWidget(*new QTabWidgetPrivate, parent, 0) |
|
324 { |
|
325 Q_D(QTabWidget); |
|
326 d->init(); |
|
327 } |
|
328 |
|
329 #ifdef QT3_SUPPORT |
|
330 /*! |
|
331 Use one of the constructors that doesn't take the \a name |
|
332 argument and then use setObjectName() instead. |
|
333 */ |
|
334 QTabWidget::QTabWidget(QWidget *parent, const char *name, Qt::WindowFlags f) |
|
335 : QWidget(*new QTabWidgetPrivate, parent, f) |
|
336 { |
|
337 Q_D(QTabWidget); |
|
338 setObjectName(QString::fromAscii(name)); |
|
339 d->init(); |
|
340 } |
|
341 #endif |
|
342 |
|
343 /*! |
|
344 Destroys the tabbed widget. |
|
345 */ |
|
346 QTabWidget::~QTabWidget() |
|
347 { |
|
348 } |
|
349 |
|
350 /*! |
|
351 \fn int QTabWidget::addTab(QWidget *page, const QString &label) |
|
352 |
|
353 Adds a tab with the given \a page and \a label to the tab widget, |
|
354 and returns the index of the tab in the tab bar. |
|
355 |
|
356 If the tab's \a label contains an ampersand, the letter following |
|
357 the ampersand is used as a shortcut for the tab, e.g. if the |
|
358 label is "Bro\&wse" then Alt+W becomes a shortcut which will |
|
359 move the focus to this tab. |
|
360 |
|
361 \note If you call addTab() after show(), the layout system will try |
|
362 to adjust to the changes in its widgets hierarchy and may cause |
|
363 flicker. To prevent this, you can set the QWidget::updatesEnabled |
|
364 property to false prior to changes; remember to set the property |
|
365 to true when the changes are done, making the widget receive paint |
|
366 events again. |
|
367 |
|
368 \sa insertTab() |
|
369 */ |
|
370 int QTabWidget::addTab(QWidget *child, const QString &label) |
|
371 { |
|
372 return insertTab(-1, child, label); |
|
373 } |
|
374 |
|
375 |
|
376 /*! |
|
377 \fn int QTabWidget::addTab(QWidget *page, const QIcon &icon, const QString &label) |
|
378 \overload |
|
379 |
|
380 Adds a tab with the given \a page, \a icon, and \a label to the tab |
|
381 widget, and returns the index of the tab in the tab bar. |
|
382 |
|
383 This function is the same as addTab(), but with an additional \a |
|
384 icon. |
|
385 */ |
|
386 int QTabWidget::addTab(QWidget *child, const QIcon& icon, const QString &label) |
|
387 { |
|
388 return insertTab(-1, child, icon, label); |
|
389 } |
|
390 |
|
391 |
|
392 /*! |
|
393 \fn int QTabWidget::insertTab(int index, QWidget *page, const QString &label) |
|
394 |
|
395 Inserts a tab with the given \a label and \a page into the tab |
|
396 widget at the specified \a index, and returns the index of the |
|
397 inserted tab in the tab bar. |
|
398 |
|
399 The label is displayed in the tab and may vary in appearance depending |
|
400 on the configuration of the tab widget. |
|
401 |
|
402 If the tab's \a label contains an ampersand, the letter following |
|
403 the ampersand is used as a shortcut for the tab, e.g. if the |
|
404 label is "Bro\&wse" then Alt+W becomes a shortcut which will |
|
405 move the focus to this tab. |
|
406 |
|
407 If \a index is out of range, the tab is simply appended. |
|
408 Otherwise it is inserted at the specified position. |
|
409 |
|
410 If the QTabWidget was empty before this function is called, the |
|
411 new page becomes the current page. Inserting a new tab at an index |
|
412 less than or equal to the current index will increment the current |
|
413 index, but keep the current page. |
|
414 |
|
415 \note If you call insertTab() after show(), the layout system will try |
|
416 to adjust to the changes in its widgets hierarchy and may cause |
|
417 flicker. To prevent this, you can set the QWidget::updatesEnabled |
|
418 property to false prior to changes; remember to set the property |
|
419 to true when the changes are done, making the widget receive paint |
|
420 events again. |
|
421 |
|
422 \sa addTab() |
|
423 */ |
|
424 int QTabWidget::insertTab(int index, QWidget *w, const QString &label) |
|
425 { |
|
426 return insertTab(index, w, QIcon(), label); |
|
427 } |
|
428 |
|
429 |
|
430 /*! |
|
431 \fn int QTabWidget::insertTab(int index, QWidget *page, const QIcon& icon, const QString &label) |
|
432 \overload |
|
433 |
|
434 Inserts a tab with the given \a label, \a page, and \a icon into |
|
435 the tab widget at the specified \a index, and returns the index of the |
|
436 inserted tab in the tab bar. |
|
437 |
|
438 This function is the same as insertTab(), but with an additional |
|
439 \a icon. |
|
440 */ |
|
441 int QTabWidget::insertTab(int index, QWidget *w, const QIcon& icon, const QString &label) |
|
442 { |
|
443 Q_D(QTabWidget); |
|
444 if(!w) |
|
445 return -1; |
|
446 index = d->stack->insertWidget(index, w); |
|
447 d->tabs->insertTab(index, icon, label); |
|
448 setUpLayout(); |
|
449 tabInserted(index); |
|
450 |
|
451 return index; |
|
452 } |
|
453 |
|
454 |
|
455 /*! |
|
456 Defines a new \a label for the page at position \a index's tab. |
|
457 |
|
458 If the provided text contains an ampersand character ('&'), a |
|
459 shortcut is automatically created for it. The character that |
|
460 follows the '&' will be used as the shortcut key. Any previous |
|
461 shortcut will be overwritten, or cleared if no shortcut is defined |
|
462 by the text. See the \l {QShortcut#mnemonic}{QShortcut} |
|
463 documentation for details (to display an actual ampersand, use |
|
464 '&&'). |
|
465 |
|
466 */ |
|
467 void QTabWidget::setTabText(int index, const QString &label) |
|
468 { |
|
469 Q_D(QTabWidget); |
|
470 d->tabs->setTabText(index, label); |
|
471 setUpLayout(); |
|
472 } |
|
473 |
|
474 /*! |
|
475 Returns the label text for the tab on the page at position \a index. |
|
476 */ |
|
477 |
|
478 QString QTabWidget::tabText(int index) const |
|
479 { |
|
480 Q_D(const QTabWidget); |
|
481 return d->tabs->tabText(index); |
|
482 } |
|
483 |
|
484 /*! |
|
485 \overload |
|
486 |
|
487 Sets the \a icon for the tab at position \a index. |
|
488 */ |
|
489 void QTabWidget::setTabIcon(int index, const QIcon &icon) |
|
490 { |
|
491 Q_D(QTabWidget); |
|
492 d->tabs->setTabIcon(index, icon); |
|
493 setUpLayout(); |
|
494 } |
|
495 |
|
496 /*! |
|
497 Returns the icon for the tab on the page at position \a index. |
|
498 */ |
|
499 |
|
500 QIcon QTabWidget::tabIcon(int index) const |
|
501 { |
|
502 Q_D(const QTabWidget); |
|
503 return d->tabs->tabIcon(index); |
|
504 } |
|
505 |
|
506 /*! |
|
507 Returns true if the page at position \a index is enabled; otherwise returns false. |
|
508 |
|
509 \sa setTabEnabled(), QWidget::isEnabled() |
|
510 */ |
|
511 |
|
512 bool QTabWidget::isTabEnabled(int index) const |
|
513 { |
|
514 Q_D(const QTabWidget); |
|
515 return d->tabs->isTabEnabled(index); |
|
516 } |
|
517 |
|
518 /*! |
|
519 If \a enable is true, the page at position \a index is enabled; otherwise the page at position \a index is |
|
520 disabled. The page's tab is redrawn appropriately. |
|
521 |
|
522 QTabWidget uses QWidget::setEnabled() internally, rather than |
|
523 keeping a separate flag. |
|
524 |
|
525 Note that even a disabled tab/page may be visible. If the page is |
|
526 visible already, QTabWidget will not hide it; if all the pages are |
|
527 disabled, QTabWidget will show one of them. |
|
528 |
|
529 \sa isTabEnabled(), QWidget::setEnabled() |
|
530 */ |
|
531 |
|
532 void QTabWidget::setTabEnabled(int index, bool enable) |
|
533 { |
|
534 Q_D(QTabWidget); |
|
535 d->tabs->setTabEnabled(index, enable); |
|
536 } |
|
537 |
|
538 /*! |
|
539 \fn void QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner) |
|
540 |
|
541 Sets the given \a widget to be shown in the specified \a corner of the |
|
542 tab widget. The geometry of the widget is determined based on the widget's |
|
543 sizeHint() and the style(). |
|
544 |
|
545 Only the horizontal element of the \a corner will be used. |
|
546 |
|
547 Passing 0 shows no widget in the corner. |
|
548 |
|
549 Any previously set corner widget is hidden. |
|
550 |
|
551 All widgets set here will be deleted by the tab widget when it is |
|
552 destroyed unless you separately reparent the widget after setting |
|
553 some other corner widget (or 0). |
|
554 |
|
555 Note: Corner widgets are designed for \l North and \l South tab positions; |
|
556 other orientations are known to not work properly. |
|
557 |
|
558 \sa cornerWidget(), setTabPosition() |
|
559 */ |
|
560 void QTabWidget::setCornerWidget(QWidget * widget, Qt::Corner corner) |
|
561 { |
|
562 Q_D(QTabWidget); |
|
563 if (widget && widget->parentWidget() != this) |
|
564 widget->setParent(this); |
|
565 |
|
566 if (corner & Qt::TopRightCorner) { |
|
567 if (d->rightCornerWidget) |
|
568 d->rightCornerWidget->hide(); |
|
569 d->rightCornerWidget = widget; |
|
570 } else { |
|
571 if (d->leftCornerWidget) |
|
572 d->leftCornerWidget->hide(); |
|
573 d->leftCornerWidget = widget; |
|
574 } |
|
575 setUpLayout(); |
|
576 } |
|
577 |
|
578 /*! |
|
579 Returns the widget shown in the \a corner of the tab widget or 0. |
|
580 */ |
|
581 QWidget * QTabWidget::cornerWidget(Qt::Corner corner) const |
|
582 { |
|
583 Q_D(const QTabWidget); |
|
584 if (corner & Qt::TopRightCorner) |
|
585 return d->rightCornerWidget; |
|
586 return d->leftCornerWidget; |
|
587 } |
|
588 |
|
589 /*! |
|
590 Removes the tab at position \a index from this stack of widgets. |
|
591 The page widget itself is not deleted. |
|
592 |
|
593 \sa addTab(), insertTab() |
|
594 */ |
|
595 void QTabWidget::removeTab(int index) |
|
596 { |
|
597 Q_D(QTabWidget); |
|
598 if (QWidget *w = d->stack->widget(index)) |
|
599 d->stack->removeWidget(w); |
|
600 } |
|
601 |
|
602 /*! |
|
603 Returns a pointer to the page currently being displayed by the tab |
|
604 dialog. The tab dialog does its best to make sure that this value |
|
605 is never 0 (but if you try hard enough, it can be). |
|
606 |
|
607 \sa currentIndex(), setCurrentWidget() |
|
608 */ |
|
609 |
|
610 QWidget * QTabWidget::currentWidget() const |
|
611 { |
|
612 Q_D(const QTabWidget); |
|
613 return d->stack->currentWidget(); |
|
614 } |
|
615 |
|
616 /*! |
|
617 Makes \a widget the current widget. The \a widget used must be a page in |
|
618 this tab widget. |
|
619 |
|
620 \sa addTab(), setCurrentIndex(), currentWidget() |
|
621 */ |
|
622 void QTabWidget::setCurrentWidget(QWidget *widget) |
|
623 { |
|
624 Q_D(const QTabWidget); |
|
625 d->tabs->setCurrentIndex(indexOf(widget)); |
|
626 } |
|
627 |
|
628 |
|
629 /*! |
|
630 \property QTabWidget::currentIndex |
|
631 \brief the index position of the current tab page |
|
632 |
|
633 The current index is -1 if there is no current widget. |
|
634 |
|
635 By default, this property contains a value of -1 because there are initially |
|
636 no tabs in the widget. |
|
637 */ |
|
638 |
|
639 int QTabWidget::currentIndex() const |
|
640 { |
|
641 Q_D(const QTabWidget); |
|
642 return d->tabs->currentIndex(); |
|
643 } |
|
644 |
|
645 void QTabWidget::setCurrentIndex(int index) |
|
646 { |
|
647 Q_D(QTabWidget); |
|
648 d->tabs->setCurrentIndex(index); |
|
649 } |
|
650 |
|
651 |
|
652 /*! |
|
653 Returns the index position of the page occupied by the widget \a |
|
654 w, or -1 if the widget cannot be found. |
|
655 */ |
|
656 int QTabWidget::indexOf(QWidget* w) const |
|
657 { |
|
658 Q_D(const QTabWidget); |
|
659 return d->stack->indexOf(w); |
|
660 } |
|
661 |
|
662 |
|
663 /*! |
|
664 \reimp |
|
665 */ |
|
666 void QTabWidget::resizeEvent(QResizeEvent *e) |
|
667 { |
|
668 QWidget::resizeEvent(e); |
|
669 setUpLayout(); |
|
670 } |
|
671 |
|
672 /*! |
|
673 Replaces the dialog's QTabBar heading with the tab bar \a tb. Note |
|
674 that this must be called \e before any tabs have been added, or |
|
675 the behavior is undefined. |
|
676 |
|
677 \sa tabBar() |
|
678 */ |
|
679 void QTabWidget::setTabBar(QTabBar* tb) |
|
680 { |
|
681 Q_D(QTabWidget); |
|
682 Q_ASSERT(tb); |
|
683 |
|
684 if (tb->parentWidget() != this) { |
|
685 tb->setParent(this); |
|
686 tb->show(); |
|
687 } |
|
688 delete d->tabs; |
|
689 d->tabs = tb; |
|
690 setFocusProxy(d->tabs); |
|
691 connect(d->tabs, SIGNAL(currentChanged(int)), |
|
692 this, SLOT(_q_showTab(int))); |
|
693 connect(d->tabs, SIGNAL(tabMoved(int, int)), |
|
694 this, SLOT(_q_tabMoved(int, int))); |
|
695 if (d->tabs->tabsClosable()) |
|
696 connect(d->tabs, SIGNAL(tabCloseRequested(int)), |
|
697 this, SIGNAL(tabCloseRequested(int))); |
|
698 tb->setExpanding(!documentMode()); |
|
699 setUpLayout(); |
|
700 } |
|
701 |
|
702 |
|
703 /*! |
|
704 Returns the current QTabBar. |
|
705 |
|
706 \sa setTabBar() |
|
707 */ |
|
708 QTabBar* QTabWidget::tabBar() const |
|
709 { |
|
710 Q_D(const QTabWidget); |
|
711 return d->tabs; |
|
712 } |
|
713 |
|
714 /*! |
|
715 Ensures that the selected tab's page is visible and appropriately |
|
716 sized. |
|
717 */ |
|
718 |
|
719 void QTabWidgetPrivate::_q_showTab(int index) |
|
720 { |
|
721 Q_Q(QTabWidget); |
|
722 if (index < stack->count() && index >= 0) |
|
723 stack->setCurrentIndex(index); |
|
724 emit q->currentChanged(index); |
|
725 #ifdef QT3_SUPPORT |
|
726 emit q->selected(q->tabText(index)); |
|
727 emit q->currentChanged(stack->widget(index)); |
|
728 #endif |
|
729 } |
|
730 |
|
731 void QTabWidgetPrivate::_q_removeTab(int index) |
|
732 { |
|
733 Q_Q(QTabWidget); |
|
734 tabs->removeTab(index); |
|
735 q->setUpLayout(); |
|
736 q->tabRemoved(index); |
|
737 } |
|
738 |
|
739 void QTabWidgetPrivate::_q_tabMoved(int from, int to) |
|
740 { |
|
741 stack->blockSignals(true); |
|
742 QWidget *w = stack->widget(from); |
|
743 stack->removeWidget(w); |
|
744 stack->insertWidget(to, w); |
|
745 stack->blockSignals(false); |
|
746 } |
|
747 |
|
748 /* |
|
749 Set up the layout. |
|
750 Get subrect from the current style, and set the geometry for the |
|
751 stack widget, tab bar and corner widgets. |
|
752 */ |
|
753 void QTabWidget::setUpLayout(bool onlyCheck) |
|
754 { |
|
755 Q_D(QTabWidget); |
|
756 if (onlyCheck && !d->dirty) |
|
757 return; // nothing to do |
|
758 |
|
759 QStyleOptionTabWidgetFrame option; |
|
760 initStyleOption(&option); |
|
761 |
|
762 // this must be done immediately, because QWidgetItem relies on it (even if !isVisible()) |
|
763 d->setLayoutItemMargins(QStyle::SE_TabWidgetLayoutItem, &option); |
|
764 |
|
765 if (!isVisible()) { |
|
766 d->dirty = true; |
|
767 return; // we'll do it later |
|
768 } |
|
769 |
|
770 QRect tabRect = style()->subElementRect(QStyle::SE_TabWidgetTabBar, &option, this); |
|
771 d->panelRect = style()->subElementRect(QStyle::SE_TabWidgetTabPane, &option, this); |
|
772 QRect contentsRect = style()->subElementRect(QStyle::SE_TabWidgetTabContents, &option, this); |
|
773 QRect leftCornerRect = style()->subElementRect(QStyle::SE_TabWidgetLeftCorner, &option, this); |
|
774 QRect rightCornerRect = style()->subElementRect(QStyle::SE_TabWidgetRightCorner, &option, this); |
|
775 |
|
776 d->tabs->setGeometry(tabRect); |
|
777 d->stack->setGeometry(contentsRect); |
|
778 if (d->leftCornerWidget) |
|
779 d->leftCornerWidget->setGeometry(leftCornerRect); |
|
780 if (d->rightCornerWidget) |
|
781 d->rightCornerWidget->setGeometry(rightCornerRect); |
|
782 |
|
783 if (!onlyCheck) |
|
784 update(); |
|
785 updateGeometry(); |
|
786 } |
|
787 |
|
788 /*! |
|
789 \internal |
|
790 */ |
|
791 static inline QSize basicSize( |
|
792 bool horizontal, const QSize &lc, const QSize &rc, const QSize &s, const QSize &t) |
|
793 { |
|
794 return horizontal |
|
795 ? QSize(qMax(s.width(), t.width() + rc.width() + lc.width()), |
|
796 s.height() + (qMax(rc.height(), qMax(lc.height(), t.height())))) |
|
797 : QSize(s.width() + (qMax(rc.width(), qMax(lc.width(), t.width()))), |
|
798 qMax(s.height(), t.height() + rc.height() + lc.height())); |
|
799 } |
|
800 |
|
801 /*! |
|
802 \reimp |
|
803 */ |
|
804 QSize QTabWidget::sizeHint() const |
|
805 { |
|
806 Q_D(const QTabWidget); |
|
807 QSize lc(0, 0), rc(0, 0); |
|
808 QStyleOption opt(0); |
|
809 opt.init(this); |
|
810 opt.state = QStyle::State_None; |
|
811 |
|
812 if (d->leftCornerWidget) |
|
813 lc = d->leftCornerWidget->sizeHint(); |
|
814 if(d->rightCornerWidget) |
|
815 rc = d->rightCornerWidget->sizeHint(); |
|
816 if (!d->dirty) { |
|
817 QTabWidget *that = (QTabWidget*)this; |
|
818 that->setUpLayout(true); |
|
819 } |
|
820 QSize s(d->stack->sizeHint()); |
|
821 QSize t(d->tabs->sizeHint()); |
|
822 if(usesScrollButtons()) |
|
823 t = t.boundedTo(QSize(200,200)); |
|
824 else |
|
825 t = t.boundedTo(QApplication::desktop()->size()); |
|
826 |
|
827 QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t); |
|
828 |
|
829 return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this) |
|
830 .expandedTo(QApplication::globalStrut()); |
|
831 } |
|
832 |
|
833 |
|
834 /*! |
|
835 \reimp |
|
836 |
|
837 Returns a suitable minimum size for the tab widget. |
|
838 */ |
|
839 QSize QTabWidget::minimumSizeHint() const |
|
840 { |
|
841 Q_D(const QTabWidget); |
|
842 QSize lc(0, 0), rc(0, 0); |
|
843 |
|
844 if(d->leftCornerWidget) |
|
845 lc = d->leftCornerWidget->minimumSizeHint(); |
|
846 if(d->rightCornerWidget) |
|
847 rc = d->rightCornerWidget->minimumSizeHint(); |
|
848 if (!d->dirty) { |
|
849 QTabWidget *that = (QTabWidget*)this; |
|
850 that->setUpLayout(true); |
|
851 } |
|
852 QSize s(d->stack->minimumSizeHint()); |
|
853 QSize t(d->tabs->minimumSizeHint()); |
|
854 |
|
855 QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t); |
|
856 |
|
857 QStyleOption opt(0); |
|
858 opt.rect = rect(); |
|
859 opt.palette = palette(); |
|
860 opt.state = QStyle::State_None; |
|
861 return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this) |
|
862 .expandedTo(QApplication::globalStrut()); |
|
863 } |
|
864 |
|
865 /*! |
|
866 \reimp |
|
867 */ |
|
868 void QTabWidget::showEvent(QShowEvent *) |
|
869 { |
|
870 setUpLayout(); |
|
871 } |
|
872 |
|
873 void QTabWidgetPrivate::updateTabBarPosition() |
|
874 { |
|
875 Q_Q(QTabWidget); |
|
876 switch (pos) { |
|
877 case QTabWidget::North: |
|
878 tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedNorth |
|
879 : QTabBar::TriangularNorth); |
|
880 break; |
|
881 case QTabWidget::South: |
|
882 tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedSouth |
|
883 : QTabBar::TriangularSouth); |
|
884 break; |
|
885 case QTabWidget::West: |
|
886 tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedWest |
|
887 : QTabBar::TriangularWest); |
|
888 break; |
|
889 case QTabWidget::East: |
|
890 tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedEast |
|
891 : QTabBar::TriangularEast); |
|
892 break; |
|
893 } |
|
894 q->setUpLayout(); |
|
895 } |
|
896 |
|
897 /*! |
|
898 \property QTabWidget::tabPosition |
|
899 \brief the position of the tabs in this tab widget |
|
900 |
|
901 Possible values for this property are described by the TabPosition |
|
902 enum. |
|
903 |
|
904 By default, this property is set to \l North. |
|
905 |
|
906 \sa TabPosition |
|
907 */ |
|
908 QTabWidget::TabPosition QTabWidget::tabPosition() const |
|
909 { |
|
910 Q_D(const QTabWidget); |
|
911 return d->pos; |
|
912 } |
|
913 |
|
914 void QTabWidget::setTabPosition(TabPosition pos) |
|
915 { |
|
916 Q_D(QTabWidget); |
|
917 if (d->pos == pos) |
|
918 return; |
|
919 d->pos = pos; |
|
920 d->updateTabBarPosition(); |
|
921 } |
|
922 |
|
923 /*! |
|
924 \property QTabWidget::tabsClosable |
|
925 \brief whether close buttons are automatically added to each tab. |
|
926 |
|
927 \since 4.5 |
|
928 |
|
929 \sa QTabBar::tabsClosable() |
|
930 */ |
|
931 bool QTabWidget::tabsClosable() const |
|
932 { |
|
933 return tabBar()->tabsClosable(); |
|
934 } |
|
935 |
|
936 void QTabWidget::setTabsClosable(bool closeable) |
|
937 { |
|
938 if (tabsClosable() == closeable) |
|
939 return; |
|
940 |
|
941 tabBar()->setTabsClosable(closeable); |
|
942 if (closeable) |
|
943 connect(tabBar(), SIGNAL(tabCloseRequested(int)), |
|
944 this, SIGNAL(tabCloseRequested(int))); |
|
945 else |
|
946 disconnect(tabBar(), SIGNAL(tabCloseRequested(int)), |
|
947 this, SIGNAL(tabCloseRequested(int))); |
|
948 setUpLayout(); |
|
949 } |
|
950 |
|
951 /*! |
|
952 \property QTabWidget::movable |
|
953 \brief This property holds whether the user can move the tabs |
|
954 within the tabbar area. |
|
955 |
|
956 \since 4.5 |
|
957 |
|
958 By default, this property is false; |
|
959 */ |
|
960 |
|
961 bool QTabWidget::isMovable() const |
|
962 { |
|
963 return tabBar()->isMovable(); |
|
964 } |
|
965 |
|
966 void QTabWidget::setMovable(bool movable) |
|
967 { |
|
968 tabBar()->setMovable(movable); |
|
969 } |
|
970 |
|
971 /*! |
|
972 \property QTabWidget::tabShape |
|
973 \brief the shape of the tabs in this tab widget |
|
974 |
|
975 Possible values for this property are QTabWidget::Rounded |
|
976 (default) or QTabWidget::Triangular. |
|
977 |
|
978 \sa TabShape |
|
979 */ |
|
980 |
|
981 QTabWidget::TabShape QTabWidget::tabShape() const |
|
982 { |
|
983 Q_D(const QTabWidget); |
|
984 return d->shape; |
|
985 } |
|
986 |
|
987 void QTabWidget::setTabShape(TabShape s) |
|
988 { |
|
989 Q_D(QTabWidget); |
|
990 if (d->shape == s) |
|
991 return; |
|
992 d->shape = s; |
|
993 d->updateTabBarPosition(); |
|
994 } |
|
995 |
|
996 /*! |
|
997 \reimp |
|
998 */ |
|
999 bool QTabWidget::event(QEvent *ev) |
|
1000 { |
|
1001 if (ev->type() == QEvent::LayoutRequest) |
|
1002 setUpLayout(); |
|
1003 return QWidget::event(ev); |
|
1004 } |
|
1005 |
|
1006 /*! |
|
1007 \reimp |
|
1008 */ |
|
1009 void QTabWidget::changeEvent(QEvent *ev) |
|
1010 { |
|
1011 if (ev->type() == QEvent::StyleChange |
|
1012 #ifdef Q_WS_MAC |
|
1013 || ev->type() == QEvent::MacSizeChange |
|
1014 #endif |
|
1015 ) |
|
1016 setUpLayout(); |
|
1017 QWidget::changeEvent(ev); |
|
1018 } |
|
1019 |
|
1020 |
|
1021 /*! |
|
1022 \reimp |
|
1023 */ |
|
1024 void QTabWidget::keyPressEvent(QKeyEvent *e) |
|
1025 { |
|
1026 Q_D(QTabWidget); |
|
1027 if (((e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) && |
|
1028 count() > 1 && e->modifiers() & Qt::ControlModifier) |
|
1029 #ifdef QT_KEYPAD_NAVIGATION |
|
1030 || QApplication::keypadNavigationEnabled() && (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right) && count() > 1 |
|
1031 #endif |
|
1032 ) { |
|
1033 int pageCount = d->tabs->count(); |
|
1034 int page = currentIndex(); |
|
1035 int dx = (e->key() == Qt::Key_Backtab || e->modifiers() & Qt::ShiftModifier) ? -1 : 1; |
|
1036 #ifdef QT_KEYPAD_NAVIGATION |
|
1037 if (QApplication::keypadNavigationEnabled() && (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right)) |
|
1038 dx = e->key() == (isRightToLeft() ? Qt::Key_Right : Qt::Key_Left) ? -1 : 1; |
|
1039 #endif |
|
1040 for (int pass = 0; pass < pageCount; ++pass) { |
|
1041 page+=dx; |
|
1042 if (page < 0 |
|
1043 #ifdef QT_KEYPAD_NAVIGATION |
|
1044 && !e->isAutoRepeat() |
|
1045 #endif |
|
1046 ) { |
|
1047 page = count() - 1; |
|
1048 } else if (page >= pageCount |
|
1049 #ifdef QT_KEYPAD_NAVIGATION |
|
1050 && !e->isAutoRepeat() |
|
1051 #endif |
|
1052 ) { |
|
1053 page = 0; |
|
1054 } |
|
1055 if (d->tabs->isTabEnabled(page)) { |
|
1056 setCurrentIndex(page); |
|
1057 break; |
|
1058 } |
|
1059 } |
|
1060 if (!QApplication::focusWidget()) |
|
1061 d->tabs->setFocus(); |
|
1062 } else { |
|
1063 e->ignore(); |
|
1064 } |
|
1065 } |
|
1066 |
|
1067 /*! |
|
1068 Returns the tab page at index position \a index or 0 if the \a |
|
1069 index is out of range. |
|
1070 */ |
|
1071 QWidget *QTabWidget::widget(int index) const |
|
1072 { |
|
1073 Q_D(const QTabWidget); |
|
1074 return d->stack->widget(index); |
|
1075 } |
|
1076 |
|
1077 /*! |
|
1078 \property QTabWidget::count |
|
1079 \brief the number of tabs in the tab bar |
|
1080 |
|
1081 By default, this property contains a value of 0. |
|
1082 */ |
|
1083 int QTabWidget::count() const |
|
1084 { |
|
1085 Q_D(const QTabWidget); |
|
1086 return d->tabs->count(); |
|
1087 } |
|
1088 |
|
1089 #ifndef QT_NO_TOOLTIP |
|
1090 /*! |
|
1091 Sets the tab tool tip for the page at position \a index to \a tip. |
|
1092 |
|
1093 \sa tabToolTip() |
|
1094 */ |
|
1095 void QTabWidget::setTabToolTip(int index, const QString & tip) |
|
1096 { |
|
1097 Q_D(QTabWidget); |
|
1098 d->tabs->setTabToolTip(index, tip); |
|
1099 } |
|
1100 |
|
1101 /*! |
|
1102 Returns the tab tool tip for the page at position \a index or |
|
1103 an empty string if no tool tip has been set. |
|
1104 |
|
1105 \sa setTabToolTip() |
|
1106 */ |
|
1107 QString QTabWidget::tabToolTip(int index) const |
|
1108 { |
|
1109 Q_D(const QTabWidget); |
|
1110 return d->tabs->tabToolTip(index); |
|
1111 } |
|
1112 #endif // QT_NO_TOOLTIP |
|
1113 |
|
1114 #ifndef QT_NO_WHATSTHIS |
|
1115 /*! |
|
1116 \since 4.1 |
|
1117 |
|
1118 Sets the What's This help text for the page at position \a index |
|
1119 to \a text. |
|
1120 */ |
|
1121 void QTabWidget::setTabWhatsThis(int index, const QString &text) |
|
1122 { |
|
1123 Q_D(QTabWidget); |
|
1124 d->tabs->setTabWhatsThis(index, text); |
|
1125 } |
|
1126 |
|
1127 /*! |
|
1128 \since 4.1 |
|
1129 |
|
1130 Returns the What's This help text for the page at position \a index, |
|
1131 or an empty string if no help text has been set. |
|
1132 */ |
|
1133 QString QTabWidget::tabWhatsThis(int index) const |
|
1134 { |
|
1135 Q_D(const QTabWidget); |
|
1136 return d->tabs->tabWhatsThis(index); |
|
1137 } |
|
1138 #endif // QT_NO_WHATSTHIS |
|
1139 |
|
1140 /*! |
|
1141 This virtual handler is called after a new tab was added or |
|
1142 inserted at position \a index. |
|
1143 |
|
1144 \sa tabRemoved() |
|
1145 */ |
|
1146 void QTabWidget::tabInserted(int index) |
|
1147 { |
|
1148 Q_UNUSED(index) |
|
1149 } |
|
1150 |
|
1151 /*! |
|
1152 This virtual handler is called after a tab was removed from |
|
1153 position \a index. |
|
1154 |
|
1155 \sa tabInserted() |
|
1156 */ |
|
1157 void QTabWidget::tabRemoved(int index) |
|
1158 { |
|
1159 Q_UNUSED(index) |
|
1160 } |
|
1161 |
|
1162 /*! |
|
1163 \fn void QTabWidget::paintEvent(QPaintEvent *event) |
|
1164 |
|
1165 Paints the tab widget's tab bar in response to the paint \a event. |
|
1166 */ |
|
1167 void QTabWidget::paintEvent(QPaintEvent *) |
|
1168 { |
|
1169 Q_D(QTabWidget); |
|
1170 QStylePainter p(this); |
|
1171 if (documentMode()) { |
|
1172 if (QWidget *w = cornerWidget(Qt::TopLeftCorner)) { |
|
1173 QStyleOptionTabBarBaseV2 opt; |
|
1174 QTabBarPrivate::initStyleBaseOption(&opt, tabBar(), w->size()); |
|
1175 opt.rect.moveLeft(w->x() + opt.rect.x()); |
|
1176 opt.rect.moveTop(w->y() + opt.rect.y()); |
|
1177 p.drawPrimitive(QStyle::PE_FrameTabBarBase, opt); |
|
1178 } |
|
1179 if (QWidget *w = cornerWidget(Qt::TopRightCorner)) { |
|
1180 QStyleOptionTabBarBaseV2 opt; |
|
1181 QTabBarPrivate::initStyleBaseOption(&opt, tabBar(), w->size()); |
|
1182 opt.rect.moveLeft(w->x() + opt.rect.x()); |
|
1183 opt.rect.moveTop(w->y() + opt.rect.y()); |
|
1184 p.drawPrimitive(QStyle::PE_FrameTabBarBase, opt); |
|
1185 } |
|
1186 return; |
|
1187 } |
|
1188 |
|
1189 QStyleOptionTabWidgetFrame opt; |
|
1190 initStyleOption(&opt); |
|
1191 opt.rect = d->panelRect; |
|
1192 p.drawPrimitive(QStyle::PE_FrameTabWidget, opt); |
|
1193 } |
|
1194 |
|
1195 /*! |
|
1196 \property QTabWidget::iconSize |
|
1197 \brief The size for icons in the tab bar |
|
1198 \since 4.2 |
|
1199 |
|
1200 The default value is style-dependent. This is the maximum size |
|
1201 that the icons will have. Icons are not scaled up if they are of |
|
1202 smaller size. |
|
1203 |
|
1204 \sa QTabBar::iconSize |
|
1205 */ |
|
1206 QSize QTabWidget::iconSize() const |
|
1207 { |
|
1208 return d_func()->tabs->iconSize(); |
|
1209 } |
|
1210 |
|
1211 void QTabWidget::setIconSize(const QSize &size) |
|
1212 { |
|
1213 d_func()->tabs->setIconSize(size); |
|
1214 } |
|
1215 |
|
1216 /*! |
|
1217 \property QTabWidget::elideMode |
|
1218 \brief how to elide text in the tab bar |
|
1219 \since 4.2 |
|
1220 |
|
1221 This property controls how items are elided when there is not |
|
1222 enough space to show them for a given tab bar size. |
|
1223 |
|
1224 By default the value is style dependant. |
|
1225 |
|
1226 \sa QTabBar::elideMode usesScrollButtons QStyle::SH_TabBar_ElideMode |
|
1227 */ |
|
1228 Qt::TextElideMode QTabWidget::elideMode() const |
|
1229 { |
|
1230 return d_func()->tabs->elideMode(); |
|
1231 } |
|
1232 |
|
1233 void QTabWidget::setElideMode(Qt::TextElideMode mode) |
|
1234 { |
|
1235 d_func()->tabs->setElideMode(mode); |
|
1236 } |
|
1237 |
|
1238 /*! |
|
1239 \property QTabWidget::usesScrollButtons |
|
1240 \brief Whether or not a tab bar should use buttons to scroll tabs when it |
|
1241 has many tabs. |
|
1242 \since 4.2 |
|
1243 |
|
1244 When there are too many tabs in a tab bar for its size, the tab bar can either choose |
|
1245 to expand its size or to add buttons that allow you to scroll through the tabs. |
|
1246 |
|
1247 By default the value is style dependant. |
|
1248 |
|
1249 \sa elideMode QTabBar::usesScrollButtons QStyle::SH_TabBar_PreferNoArrows |
|
1250 */ |
|
1251 bool QTabWidget::usesScrollButtons() const |
|
1252 { |
|
1253 return d_func()->tabs->usesScrollButtons(); |
|
1254 } |
|
1255 |
|
1256 void QTabWidget::setUsesScrollButtons(bool useButtons) |
|
1257 { |
|
1258 d_func()->tabs->setUsesScrollButtons(useButtons); |
|
1259 } |
|
1260 |
|
1261 /*! |
|
1262 \property QTabWidget::documentMode |
|
1263 \brief Whether or not the tab widget is rendered in a mode suitable for document |
|
1264 pages. This is the same as document mode on Mac OS X. |
|
1265 \since 4.5 |
|
1266 |
|
1267 When this property is set the tab widget frame is not rendered. This mode is useful |
|
1268 for showing document-type pages where the page covers most of the tab widget |
|
1269 area. |
|
1270 |
|
1271 \sa elideMode, QTabBar::documentMode, QTabBar::usesScrollButtons, QStyle::SH_TabBar_PreferNoArrows |
|
1272 */ |
|
1273 bool QTabWidget::documentMode() const |
|
1274 { |
|
1275 Q_D(const QTabWidget); |
|
1276 return d->tabs->documentMode(); |
|
1277 } |
|
1278 |
|
1279 void QTabWidget::setDocumentMode(bool enabled) |
|
1280 { |
|
1281 Q_D(QTabWidget); |
|
1282 d->tabs->setDocumentMode(enabled); |
|
1283 d->tabs->setExpanding(!enabled); |
|
1284 d->tabs->setDrawBase(enabled); |
|
1285 setUpLayout(); |
|
1286 } |
|
1287 |
|
1288 /*! |
|
1289 Removes all the pages, but does not delete them. Calling this function |
|
1290 is equivalent to calling removeTab() until the tab widget is empty. |
|
1291 */ |
|
1292 void QTabWidget::clear() |
|
1293 { |
|
1294 // ### optimize by introduce QStackedLayout::clear() |
|
1295 while (count()) |
|
1296 removeTab(0); |
|
1297 } |
|
1298 |
|
1299 /*! |
|
1300 \fn void QTabWidget::insertTab(QWidget *widget, const QString &label, int index) |
|
1301 |
|
1302 Use insertTab(index, widget, label) instead. |
|
1303 */ |
|
1304 |
|
1305 /*! |
|
1306 \fn void QTabWidget::insertTab(QWidget *widget, const QIcon& icon, const QString &label, int index) |
|
1307 |
|
1308 Use insertTab(index, widget, icon, label) instead. |
|
1309 */ |
|
1310 |
|
1311 /*! |
|
1312 \fn void QTabWidget::changeTab(QWidget *widget, const QString |
|
1313 &label) |
|
1314 |
|
1315 Use setTabText() instead. |
|
1316 |
|
1317 */ |
|
1318 |
|
1319 /*! |
|
1320 \fn void QTabWidget::changeTab(QWidget *widget, const QIcon& icon, const QString &label) |
|
1321 |
|
1322 Use setTabText() and setTabIcon() instead. |
|
1323 */ |
|
1324 |
|
1325 /*! |
|
1326 \fn bool QTabWidget::isTabEnabled( QWidget *widget) const |
|
1327 |
|
1328 Use isTabEnabled(tabWidget->indexOf(widget)) instead. |
|
1329 */ |
|
1330 |
|
1331 /*! |
|
1332 \fn void QTabWidget::setTabEnabled(QWidget *widget, bool b) |
|
1333 |
|
1334 Use setTabEnabled(tabWidget->indexOf(widget), b) instead. |
|
1335 */ |
|
1336 |
|
1337 /*! |
|
1338 \fn QString QTabWidget::tabLabel(QWidget *widget) const |
|
1339 |
|
1340 Use tabText(tabWidget->indexOf(widget)) instead. |
|
1341 */ |
|
1342 |
|
1343 /*! |
|
1344 \fn void QTabWidget::setTabLabel(QWidget *widget, const QString |
|
1345 &label) |
|
1346 |
|
1347 Use setTabText(tabWidget->indexOf(widget), label) instead. |
|
1348 */ |
|
1349 |
|
1350 /*! |
|
1351 \fn QIcon QTabWidget::tabIconSet(QWidget * widget) const |
|
1352 |
|
1353 Use tabIcon(tabWidget->indexOf(widget)) instead. |
|
1354 */ |
|
1355 |
|
1356 /*! |
|
1357 \fn void QTabWidget::setTabIconSet(QWidget * widget, const QIcon & icon) |
|
1358 |
|
1359 Use setTabIcon(tabWidget->indexOf(widget), icon) instead. |
|
1360 */ |
|
1361 |
|
1362 /*! |
|
1363 \fn void QTabWidget::removeTabToolTip(QWidget * widget) |
|
1364 |
|
1365 Use setTabToolTip(tabWidget->indexOf(widget), QString()) instead. |
|
1366 */ |
|
1367 |
|
1368 /*! |
|
1369 \fn void QTabWidget::setTabToolTip(QWidget * widget, const QString & tip) |
|
1370 |
|
1371 Use setTabToolTip(tabWidget->indexOf(widget), tip) instead. |
|
1372 */ |
|
1373 |
|
1374 /*! |
|
1375 \fn QString QTabWidget::tabToolTip(QWidget * widget) const |
|
1376 |
|
1377 Use tabToolTip(tabWidget->indexOf(widget)) instead. |
|
1378 */ |
|
1379 |
|
1380 /*! |
|
1381 \fn QWidget * QTabWidget::currentPage() const |
|
1382 |
|
1383 Use currentWidget() instead. |
|
1384 */ |
|
1385 |
|
1386 /*! |
|
1387 \fn QWidget *QTabWidget::page(int index) const |
|
1388 |
|
1389 Use widget() instead. |
|
1390 */ |
|
1391 |
|
1392 /*! |
|
1393 \fn QString QTabWidget::label(int index) const |
|
1394 |
|
1395 Use tabText() instead. |
|
1396 */ |
|
1397 |
|
1398 /*! |
|
1399 \fn int QTabWidget::currentPageIndex() const |
|
1400 |
|
1401 Use currentIndex() instead. |
|
1402 */ |
|
1403 |
|
1404 /*! |
|
1405 \fn int QTabWidget::margin() const |
|
1406 |
|
1407 This function is kept only to make old code compile. |
|
1408 This functionality is no longer supported by QTabWidget. |
|
1409 |
|
1410 \sa contentsRect(), setContentsMargins() |
|
1411 */ |
|
1412 |
|
1413 /*! |
|
1414 \fn void QTabWidget::setMargin(int margin) |
|
1415 |
|
1416 This function is kept only to make old code compile. |
|
1417 This functionality is no longer supported by QTabWidget. |
|
1418 |
|
1419 \sa contentsRect(), setContentsMargins() |
|
1420 */ |
|
1421 |
|
1422 /*! |
|
1423 \fn void QTabWidget::setCurrentPage(int index) |
|
1424 |
|
1425 Use setCurrentIndex() instead. |
|
1426 */ |
|
1427 |
|
1428 /*! |
|
1429 \fn void QTabWidget::showPage(QWidget *widget) |
|
1430 |
|
1431 Use setCurrentIndex(indexOf(widget)) instead. |
|
1432 */ |
|
1433 |
|
1434 /*! |
|
1435 \fn void QTabWidget::removePage(QWidget *widget) |
|
1436 |
|
1437 Use removeTab(indexOf(widget)) instead. |
|
1438 */ |
|
1439 |
|
1440 /*! |
|
1441 \fn void QTabWidget::currentChanged(QWidget *widget) |
|
1442 |
|
1443 Use currentChanged(int) instead. |
|
1444 */ |
|
1445 |
|
1446 QT_END_NAMESPACE |
|
1447 |
|
1448 #include "moc_qtabwidget.cpp" |
|
1449 |
|
1450 #endif //QT_NO_TABWIDGET |