/****************************************************************************+ −
**+ −
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).+ −
** All rights reserved.+ −
** Contact: Nokia Corporation (qt-info@nokia.com)+ −
**+ −
** This file is part of the QtGui module of the Qt Toolkit.+ −
**+ −
** $QT_BEGIN_LICENSE:LGPL$+ −
** No Commercial Usage+ −
** This file contains pre-release code and may not be distributed.+ −
** You may use this file in accordance with the terms and conditions+ −
** contained in the Technology Preview License Agreement accompanying+ −
** this package.+ −
**+ −
** GNU Lesser General Public License Usage+ −
** Alternatively, this file may be used under the terms of the GNU Lesser+ −
** General Public License version 2.1 as published by the Free Software+ −
** Foundation and appearing in the file LICENSE.LGPL included in the+ −
** packaging of this file. Please review the following information to+ −
** ensure the GNU Lesser General Public License version 2.1 requirements+ −
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.+ −
**+ −
** In addition, as a special exception, Nokia gives you certain additional+ −
** rights. These rights are described in the Nokia Qt LGPL Exception+ −
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.+ −
**+ −
** If you have questions regarding the use of this file, please contact+ −
** Nokia at qt-info@nokia.com.+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
** $QT_END_LICENSE$+ −
**+ −
****************************************************************************/+ −
+ −
#include "qgroupbox.h"+ −
#ifndef QT_NO_GROUPBOX+ −
#include "qapplication.h"+ −
#include "qbitmap.h"+ −
#include "qdrawutil.h"+ −
#include "qevent.h"+ −
#include "qlayout.h"+ −
#include "qradiobutton.h"+ −
#include "qstyle.h"+ −
#include "qstyleoption.h"+ −
#include "qstylepainter.h"+ −
#ifndef QT_NO_ACCESSIBILITY+ −
#include "qaccessible.h"+ −
#endif+ −
#include <private/qwidget_p.h>+ −
+ −
#include "qdebug.h"+ −
+ −
QT_BEGIN_NAMESPACE+ −
+ −
class QGroupBoxPrivate : public QWidgetPrivate+ −
{+ −
Q_DECLARE_PUBLIC(QGroupBox)+ −
+ −
public:+ −
void skip();+ −
void init();+ −
void calculateFrame();+ −
QString title;+ −
int align;+ −
#ifndef QT_NO_SHORTCUT+ −
int shortcutId;+ −
#endif+ −
+ −
void _q_fixFocus(Qt::FocusReason reason);+ −
void _q_setChildrenEnabled(bool b);+ −
void click();+ −
bool flat;+ −
bool checkable;+ −
bool checked;+ −
bool hover;+ −
bool overCheckBox;+ −
QStyle::SubControl pressedControl;+ −
};+ −
+ −
/*!+ −
Initialize \a option with the values from this QGroupBox. This method+ −
is useful for subclasses when they need a QStyleOptionGroupBox, but don't want+ −
to fill in all the information themselves.+ −
+ −
\sa QStyleOption::initFrom()+ −
*/+ −
void QGroupBox::initStyleOption(QStyleOptionGroupBox *option) const+ −
{+ −
if (!option)+ −
return;+ −
+ −
Q_D(const QGroupBox);+ −
option->initFrom(this);+ −
option->text = d->title;+ −
option->lineWidth = 1;+ −
option->midLineWidth = 0;+ −
option->textAlignment = Qt::Alignment(d->align);+ −
option->activeSubControls |= d->pressedControl;+ −
option->subControls = QStyle::SC_GroupBoxFrame;+ −
+ −
if (d->hover)+ −
option->state |= QStyle::State_MouseOver;+ −
else+ −
option->state &= ~QStyle::State_MouseOver;+ −
+ −
if (d->flat)+ −
option->features |= QStyleOptionFrameV2::Flat;+ −
+ −
if (d->checkable) {+ −
option->subControls |= QStyle::SC_GroupBoxCheckBox;+ −
option->state |= (d->checked ? QStyle::State_On : QStyle::State_Off);+ −
if ((d->pressedControl == QStyle::SC_GroupBoxCheckBox+ −
|| d->pressedControl == QStyle::SC_GroupBoxLabel) && (d->hover || d->overCheckBox))+ −
option->state |= QStyle::State_Sunken;+ −
}+ −
+ −
if (!option->palette.isBrushSet(isEnabled() ? QPalette::Active : + −
QPalette::Disabled, QPalette::WindowText))+ −
option->textColor = QColor(style()->styleHint(QStyle::SH_GroupBox_TextLabelColor,+ −
option, this));+ −
+ −
if (!d->title.isEmpty())+ −
option->subControls |= QStyle::SC_GroupBoxLabel;+ −
}+ −
+ −
void QGroupBoxPrivate::click()+ −
{+ −
Q_Q(QGroupBox);+ −
+ −
QPointer<QGroupBox> guard(q);+ −
q->setChecked(!checked);+ −
if (!guard)+ −
return;+ −
emit q->clicked(checked);+ −
}+ −
+ −
/*!+ −
\class QGroupBox+ −
\brief The QGroupBox widget provides a group box frame with a title.+ −
+ −
\ingroup organizers+ −
\ingroup geomanagement+ −
+ −
A group box provides a frame, a title and a keyboard shortcut, and+ −
displays various other widgets inside itself. The title is on top,+ −
the keyboard shortcut moves keyboard focus to one of the group+ −
box's child widgets.+ −
+ −
QGroupBox also lets you set the \l title (normally set in the+ −
constructor) and the title's \l alignment. Group boxes can be+ −
\l checkable; child widgets in checkable group boxes are enabled or+ −
disabled depending on whether or not the group box is \l checked.+ −
+ −
You can minimize the space consumption of a group box by enabling+ −
the \l flat property. In most \l{QStyle}{styles}, enabling this+ −
property results in the removal of the left, right and bottom+ −
edges of the frame.+ −
+ −
QGroupBox doesn't automatically lay out the child widgets (which+ −
are often \l{QCheckBox}es or \l{QRadioButton}s but can be any+ −
widgets). The following example shows how we can set up a+ −
QGroupBox with a layout:+ −
+ −
\snippet examples/widgets/groupbox/window.cpp 2+ −
+ −
\table 100%+ −
\row \o \inlineimage windowsxp-groupbox.png Screenshot of a Windows XP style group box+ −
\o \inlineimage macintosh-groupbox.png Screenshot of a Macintosh style group box+ −
\o \inlineimage plastique-groupbox.png Screenshot of a Plastique style group box+ −
\row \o A \l{Windows XP Style Widget Gallery}{Windows XP style} group box.+ −
\o A \l{Macintosh Style Widget Gallery}{Macintosh style} group box.+ −
\o A \l{Plastique Style Widget Gallery}{Plastique style} group box.+ −
\endtable+ −
+ −
\sa QButtonGroup, {Group Box Example}+ −
*/+ −
+ −
+ −
+ −
/*!+ −
Constructs a group box widget with the given \a parent but with no title.+ −
*/+ −
+ −
QGroupBox::QGroupBox(QWidget *parent)+ −
: QWidget(*new QGroupBoxPrivate, parent, 0)+ −
{+ −
Q_D(QGroupBox);+ −
d->init();+ −
}+ −
+ −
/*!+ −
Constructs a group box with the given \a title and \a parent.+ −
*/+ −
+ −
QGroupBox::QGroupBox(const QString &title, QWidget *parent)+ −
: QWidget(*new QGroupBoxPrivate, parent, 0)+ −
{+ −
Q_D(QGroupBox);+ −
d->init();+ −
setTitle(title);+ −
}+ −
+ −
+ −
/*!+ −
Destroys the group box.+ −
*/+ −
QGroupBox::~QGroupBox()+ −
{+ −
}+ −
+ −
void QGroupBoxPrivate::init()+ −
{+ −
Q_Q(QGroupBox);+ −
align = Qt::AlignLeft;+ −
#ifndef QT_NO_SHORTCUT+ −
shortcutId = 0;+ −
#endif+ −
flat = false;+ −
checkable = false;+ −
checked = true;+ −
hover = false;+ −
overCheckBox = false;+ −
pressedControl = QStyle::SC_None;+ −
calculateFrame();+ −
q->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, + −
QSizePolicy::GroupBox));+ −
}+ −
+ −
void QGroupBox::setTitle(const QString &title)+ −
{+ −
Q_D(QGroupBox);+ −
if (d->title == title) // no change+ −
return;+ −
d->title = title;+ −
#ifndef QT_NO_SHORTCUT+ −
releaseShortcut(d->shortcutId);+ −
d->shortcutId = grabShortcut(QKeySequence::mnemonic(title));+ −
#endif+ −
d->calculateFrame();+ −
+ −
update();+ −
updateGeometry();+ −
#ifndef QT_NO_ACCESSIBILITY+ −
QAccessible::updateAccessibility(this, 0, QAccessible::NameChanged);+ −
#endif+ −
}+ −
+ −
/*!+ −
\property QGroupBox::title+ −
\brief the group box title text+ −
+ −
The group box title text will have a keyboard shortcut if the title+ −
contains an ampersand ('&') followed by a letter.+ −
+ −
\snippet doc/src/snippets/code/src_gui_widgets_qgroupbox.cpp 0+ −
+ −
In the example above, \key Alt+U moves the keyboard focus to the+ −
group box. See the \l {QShortcut#mnemonic}{QShortcut}+ −
documentation for details (to display an actual ampersand, use+ −
'&&').+ −
+ −
There is no default title text.+ −
+ −
\sa alignment+ −
*/+ −
+ −
QString QGroupBox::title() const+ −
{+ −
Q_D(const QGroupBox);+ −
return d->title;+ −
}+ −
+ −
/*!+ −
\property QGroupBox::alignment+ −
\brief the alignment of the group box title.+ −
+ −
Most styles place the title at the top of the frame. The horizontal+ −
alignment of the title can be specified using single values from+ −
the following list:+ −
+ −
\list+ −
\i Qt::AlignLeft aligns the title text with the left-hand side of the group box.+ −
\i Qt::AlignRight aligns the title text with the right-hand side of the group box.+ −
\i Qt::AlignHCenter aligns the title text with the horizontal center of the group box.+ −
\endlist+ −
+ −
The default alignment is Qt::AlignLeft.+ −
+ −
\sa Qt::Alignment+ −
*/+ −
Qt::Alignment QGroupBox::alignment() const+ −
{+ −
Q_D(const QGroupBox);+ −
return QFlag(d->align);+ −
}+ −
+ −
void QGroupBox::setAlignment(int alignment)+ −
{+ −
Q_D(QGroupBox);+ −
d->align = alignment;+ −
updateGeometry();+ −
update();+ −
}+ −
+ −
/*! \reimp+ −
*/+ −
void QGroupBox::resizeEvent(QResizeEvent *e)+ −
{+ −
QWidget::resizeEvent(e);+ −
}+ −
+ −
/*! \reimp+ −
*/+ −
+ −
void QGroupBox::paintEvent(QPaintEvent *)+ −
{+ −
QStylePainter paint(this);+ −
QStyleOptionGroupBox option;+ −
initStyleOption(&option);+ −
paint.drawComplexControl(QStyle::CC_GroupBox, option);+ −
}+ −
+ −
/*! \reimp */+ −
bool QGroupBox::event(QEvent *e)+ −
{+ −
Q_D(QGroupBox);+ −
#ifndef QT_NO_SHORTCUT+ −
if (e->type() == QEvent::Shortcut) {+ −
QShortcutEvent *se = static_cast<QShortcutEvent *>(e);+ −
if (se->shortcutId() == d->shortcutId) {+ −
if (!isCheckable()) {+ −
d->_q_fixFocus(Qt::ShortcutFocusReason);+ −
} else {+ −
d->click();+ −
setFocus(Qt::ShortcutFocusReason);+ −
}+ −
return true;+ −
}+ −
}+ −
#endif+ −
QStyleOptionGroupBox box;+ −
initStyleOption(&box);+ −
switch (e->type()) {+ −
case QEvent::HoverEnter:+ −
case QEvent::HoverMove: {+ −
QStyle::SubControl control = style()->hitTestComplexControl(QStyle::CC_GroupBox, &box,+ −
static_cast<QHoverEvent *>(e)->pos(),+ −
this);+ −
bool oldHover = d->hover;+ −
d->hover = d->checkable && (control == QStyle::SC_GroupBoxLabel || control == QStyle::SC_GroupBoxCheckBox);+ −
if (oldHover != d->hover) {+ −
QRect rect = style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this)+ −
| style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxLabel, this);+ −
update(rect);+ −
}+ −
return true;+ −
}+ −
case QEvent::HoverLeave:+ −
d->hover = false;+ −
if (d->checkable) {+ −
QRect rect = style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this)+ −
| style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxLabel, this);+ −
update(rect);+ −
}+ −
return true;+ −
case QEvent::KeyPress: {+ −
QKeyEvent *k = static_cast<QKeyEvent*>(e);+ −
if (!k->isAutoRepeat() && (k->key() == Qt::Key_Select || k->key() == Qt::Key_Space)) {+ −
d->pressedControl = QStyle::SC_GroupBoxCheckBox;+ −
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));+ −
return true;+ −
}+ −
break;+ −
}+ −
case QEvent::KeyRelease: {+ −
QKeyEvent *k = static_cast<QKeyEvent*>(e);+ −
if (!k->isAutoRepeat() && (k->key() == Qt::Key_Select || k->key() == Qt::Key_Space)) {+ −
bool toggle = (d->pressedControl == QStyle::SC_GroupBoxLabel+ −
|| d->pressedControl == QStyle::SC_GroupBoxCheckBox);+ −
d->pressedControl = QStyle::SC_None;+ −
if (toggle)+ −
d->click();+ −
return true;+ −
}+ −
break;+ −
}+ −
default:+ −
break;+ −
}+ −
return QWidget::event(e);+ −
}+ −
+ −
/*!\reimp */+ −
void QGroupBox::childEvent(QChildEvent *c)+ −
{+ −
Q_D(QGroupBox);+ −
if (c->type() != QEvent::ChildAdded || !c->child()->isWidgetType())+ −
return;+ −
QWidget *w = (QWidget*)c->child();+ −
if (d->checkable) {+ −
if (d->checked) {+ −
if (!w->testAttribute(Qt::WA_ForceDisabled))+ −
w->setEnabled(true);+ −
} else {+ −
if (w->isEnabled()) {+ −
w->setEnabled(false);+ −
w->setAttribute(Qt::WA_ForceDisabled, false);+ −
}+ −
}+ −
}+ −
}+ −
+ −
+ −
/*!+ −
\internal+ −
+ −
This private slot finds a widget in this group box that can accept+ −
focus, and gives the focus to that widget.+ −
*/+ −
+ −
void QGroupBoxPrivate::_q_fixFocus(Qt::FocusReason reason)+ −
{+ −
Q_Q(QGroupBox);+ −
QWidget *fw = q->focusWidget();+ −
if (!fw || fw == q) {+ −
QWidget * best = 0;+ −
QWidget * candidate = 0;+ −
QWidget * w = q;+ −
while ((w = w->nextInFocusChain()) != q) {+ −
if (q->isAncestorOf(w) && (w->focusPolicy() & Qt::TabFocus) == Qt::TabFocus && w->isVisibleTo(q)) {+ −
if (!best && qobject_cast<QRadioButton*>(w) && ((QRadioButton*)w)->isChecked())+ −
// we prefer a checked radio button or a widget that+ −
// already has focus, if there is one+ −
best = w;+ −
else+ −
if (!candidate)+ −
// but we'll accept anything that takes focus+ −
candidate = w;+ −
}+ −
}+ −
if (best)+ −
fw = best;+ −
else if (candidate)+ −
fw = candidate;+ −
}+ −
if (fw)+ −
fw->setFocus(reason);+ −
}+ −
+ −
/*+ −
Sets the right frame rect depending on the title.+ −
*/+ −
void QGroupBoxPrivate::calculateFrame()+ −
{+ −
Q_Q(QGroupBox);+ −
QStyleOptionGroupBox box;+ −
q->initStyleOption(&box);+ −
QRect contentsRect = q->style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxContents, q);+ −
q->setContentsMargins(contentsRect.left() - box.rect.left(), contentsRect.top() - box.rect.top(),+ −
box.rect.right() - contentsRect.right(), box.rect.bottom() - contentsRect.bottom());+ −
setLayoutItemMargins(QStyle::SE_GroupBoxLayoutItem, &box);+ −
}+ −
+ −
/*! \reimp+ −
*/+ −
void QGroupBox::focusInEvent(QFocusEvent *fe)+ −
{ // note no call to super+ −
Q_D(QGroupBox);+ −
if (focusPolicy() == Qt::NoFocus) {+ −
d->_q_fixFocus(fe->reason());+ −
} else {+ −
QWidget::focusInEvent(fe);+ −
}+ −
}+ −
+ −
+ −
/*!+ −
\reimp+ −
*/+ −
QSize QGroupBox::minimumSizeHint() const+ −
{+ −
Q_D(const QGroupBox);+ −
QStyleOptionGroupBox option;+ −
initStyleOption(&option);+ −
+ −
QFontMetrics metrics(fontMetrics());+ −
+ −
int baseWidth = metrics.width(d->title) + metrics.width(QLatin1Char(' '));+ −
int baseHeight = metrics.height();+ −
if (d->checkable) {+ −
baseWidth += style()->pixelMetric(QStyle::PM_IndicatorWidth);+ −
baseWidth += style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing);+ −
baseHeight = qMax(baseHeight, style()->pixelMetric(QStyle::PM_IndicatorHeight));+ −
}+ −
+ −
QSize size = style()->sizeFromContents(QStyle::CT_GroupBox, &option, QSize(baseWidth, baseHeight), this);+ −
return size.expandedTo(QWidget::minimumSizeHint());+ −
}+ −
+ −
/*!+ −
\property QGroupBox::flat+ −
\brief whether the group box is painted flat or has a frame+ −
+ −
A group box usually consists of a surrounding frame with a title+ −
at the top. If this property is enabled, only the top part of the frame is+ −
drawn in most styles; otherwise the whole frame is drawn.+ −
+ −
By default, this property is disabled; i.e. group boxes are not flat unless+ −
explicitly specified.+ −
+ −
\bold{Note:} In some styles, flat and non-flat group boxes have similar+ −
representations and may not be as distinguishable as they are in other+ −
styles.+ −
+ −
\sa title+ −
*/+ −
bool QGroupBox::isFlat() const+ −
{+ −
Q_D(const QGroupBox);+ −
return d->flat;+ −
}+ −
+ −
void QGroupBox::setFlat(bool b)+ −
{+ −
Q_D(QGroupBox);+ −
if (d->flat == b)+ −
return;+ −
d->flat = b;+ −
updateGeometry();+ −
update();+ −
}+ −
+ −
+ −
/*!+ −
\property QGroupBox::checkable+ −
\brief whether the group box has a checkbox in its title+ −
+ −
If this property is true, the group box displays its title using+ −
a checkbox in place of an ordinary label. If the checkbox is checked,+ −
the group box's children are enabled; otherwise they are disabled and+ −
inaccessible.+ −
+ −
By default, group boxes are not checkable.+ −
+ −
If this property is enabled for a group box, it will also be initially+ −
checked to ensure that its contents are enabled.+ −
+ −
\sa checked+ −
*/+ −
void QGroupBox::setCheckable(bool checkable)+ −
{+ −
Q_D(QGroupBox);+ −
+ −
bool wasCheckable = d->checkable;+ −
d->checkable = checkable;+ −
+ −
if (checkable) {+ −
setChecked(true);+ −
if (!wasCheckable) {+ −
setFocusPolicy(Qt::StrongFocus);+ −
d->_q_setChildrenEnabled(true);+ −
updateGeometry();+ −
}+ −
} else {+ −
if (wasCheckable) {+ −
setFocusPolicy(Qt::NoFocus);+ −
d->_q_setChildrenEnabled(true);+ −
updateGeometry();+ −
}+ −
d->_q_setChildrenEnabled(true);+ −
}+ −
+ −
if (wasCheckable != checkable) {+ −
d->calculateFrame();+ −
update();+ −
}+ −
}+ −
+ −
bool QGroupBox::isCheckable() const+ −
{+ −
Q_D(const QGroupBox);+ −
return d->checkable;+ −
}+ −
+ −
+ −
bool QGroupBox::isChecked() const+ −
{+ −
Q_D(const QGroupBox);+ −
return d->checkable && d->checked;+ −
}+ −
+ −
+ −
/*!+ −
\fn void QGroupBox::toggled(bool on)+ −
+ −
If the group box is checkable, this signal is emitted when the check box+ −
is toggled. \a on is true if the check box is checked; otherwise it is false.+ −
+ −
\sa checkable+ −
*/+ −
+ −
+ −
/*!+ −
\fn void QGroupBox::clicked(bool checked)+ −
\since 4.2+ −
+ −
This signal is emitted when the check box is activated (i.e. pressed down+ −
then released while the mouse cursor is inside the button), or when the+ −
shortcut key is typed, Notably, this signal is \e not emitted if you call+ −
setChecked().+ −
+ −
If the check box is checked \a checked is true; it is false if the check+ −
box is unchecked.+ −
+ −
\sa checkable, toggled(), checked+ −
*/+ −
+ −
/*!+ −
\property QGroupBox::checked+ −
\brief whether the group box is checked+ −
+ −
If the group box is checkable, it is displayed with a check box.+ −
If the check box is checked, the group box's children are enabled;+ −
otherwise the children are disabled and are inaccessible to the user.+ −
+ −
By default, checkable group boxes are also checked.+ −
+ −
\sa checkable+ −
*/+ −
void QGroupBox::setChecked(bool b)+ −
{+ −
Q_D(QGroupBox);+ −
if (d->checkable && b != d->checked) {+ −
update();+ −
d->checked = b;+ −
d->_q_setChildrenEnabled(b);+ −
emit toggled(b);+ −
}+ −
}+ −
+ −
/*+ −
sets all children of the group box except the qt_groupbox_checkbox+ −
to either disabled/enabled+ −
*/+ −
void QGroupBoxPrivate::_q_setChildrenEnabled(bool b)+ −
{+ −
Q_Q(QGroupBox);+ −
QObjectList childList = q->children();+ −
for (int i = 0; i < childList.size(); ++i) {+ −
QObject *o = childList.at(i);+ −
if (o->isWidgetType()) {+ −
QWidget *w = static_cast<QWidget *>(o);+ −
if (b) {+ −
if (!w->testAttribute(Qt::WA_ForceDisabled))+ −
w->setEnabled(true);+ −
} else {+ −
if (w->isEnabled()) {+ −
w->setEnabled(false);+ −
w->setAttribute(Qt::WA_ForceDisabled, false);+ −
}+ −
}+ −
}+ −
}+ −
}+ −
+ −
/*! \reimp */+ −
void QGroupBox::changeEvent(QEvent *ev)+ −
{+ −
Q_D(QGroupBox);+ −
if (ev->type() == QEvent::EnabledChange) {+ −
if (d->checkable && isEnabled()) {+ −
// we are being enabled - disable children+ −
if (!d->checked)+ −
d->_q_setChildrenEnabled(false);+ −
}+ −
} else if (ev->type() == QEvent::FontChange+ −
#ifdef Q_WS_MAC+ −
|| ev->type() == QEvent::MacSizeChange+ −
#endif+ −
|| ev->type() == QEvent::StyleChange) {+ −
d->calculateFrame();+ −
}+ −
QWidget::changeEvent(ev);+ −
}+ −
+ −
/*! \reimp */+ −
void QGroupBox::mousePressEvent(QMouseEvent *event)+ −
{+ −
if (event->button() != Qt::LeftButton) {+ −
event->ignore();+ −
return;+ −
}+ −
+ −
Q_D(QGroupBox);+ −
QStyleOptionGroupBox box;+ −
initStyleOption(&box);+ −
d->pressedControl = style()->hitTestComplexControl(QStyle::CC_GroupBox, &box,+ −
event->pos(), this);+ −
if (d->checkable && (d->pressedControl & (QStyle::SC_GroupBoxCheckBox | QStyle::SC_GroupBoxLabel))) {+ −
d->overCheckBox = true;+ −
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));+ −
}+ −
}+ −
+ −
/*! \reimp */+ −
void QGroupBox::mouseMoveEvent(QMouseEvent *event)+ −
{+ −
Q_D(QGroupBox);+ −
QStyleOptionGroupBox box;+ −
initStyleOption(&box);+ −
QStyle::SubControl pressed = style()->hitTestComplexControl(QStyle::CC_GroupBox, &box,+ −
event->pos(), this);+ −
bool oldOverCheckBox = d->overCheckBox;+ −
d->overCheckBox = (pressed == QStyle::SC_GroupBoxCheckBox || pressed == QStyle::SC_GroupBoxLabel);+ −
if (d->checkable && (d->pressedControl == QStyle::SC_GroupBoxCheckBox || d->pressedControl == QStyle::SC_GroupBoxLabel)+ −
&& (d->overCheckBox != oldOverCheckBox))+ −
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));+ −
}+ −
+ −
/*! \reimp */+ −
void QGroupBox::mouseReleaseEvent(QMouseEvent *event)+ −
{+ −
if (event->button() != Qt::LeftButton) {+ −
event->ignore();+ −
return;+ −
}+ −
+ −
Q_D(QGroupBox);+ −
QStyleOptionGroupBox box;+ −
initStyleOption(&box);+ −
QStyle::SubControl released = style()->hitTestComplexControl(QStyle::CC_GroupBox, &box,+ −
event->pos(), this);+ −
bool toggle = d->checkable && (released == QStyle::SC_GroupBoxLabel+ −
|| released == QStyle::SC_GroupBoxCheckBox);+ −
d->pressedControl = QStyle::SC_None;+ −
d->overCheckBox = false;+ −
if (toggle)+ −
d->click();+ −
else if (d->checkable)+ −
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));+ −
}+ −
+ −
#ifdef QT3_SUPPORT+ −
/*!+ −
Use one of the constructors that doesn't take the \a name+ −
argument and then use setObjectName() instead.+ −
*/+ −
QGroupBox::QGroupBox(QWidget *parent, const char *name)+ −
: QWidget(*new QGroupBoxPrivate, parent, 0)+ −
{+ −
Q_D(QGroupBox);+ −
setObjectName(QString::fromAscii(name));+ −
d->init();+ −
}+ −
+ −
/*!+ −
Use one of the constructors that doesn't take the \a name+ −
argument and then use setObjectName() instead.+ −
*/+ −
QGroupBox::QGroupBox(const QString &title, QWidget *parent, const char *name)+ −
: QWidget(*new QGroupBoxPrivate, parent, 0)+ −
{+ −
Q_D(QGroupBox);+ −
setObjectName(QString::fromAscii(name));+ −
d->init();+ −
setTitle(title);+ −
}+ −
#endif // QT3_SUPPORT+ −
+ −
QT_END_NAMESPACE+ −
+ −
#include "moc_qgroupbox.cpp"+ −
+ −
#endif //QT_NO_GROUPBOX+ −