?? qgroupbox.cpp
字號:
/************************************************************************ $Id: qt/src/widgets/qgroupbox.cpp 2.3.12 edited 2005-10-27 $**** Implementation of QGroupBox widget class**** Created : 950203**** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.**** This file is part of the widgets module of the Qt GUI Toolkit.**** This file may be distributed under the terms of the Q Public License** as defined by Trolltech AS of Norway and appearing in the file** LICENSE.QPL included in the packaging of this file.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition** licenses may use this file in accordance with the Qt Commercial License** Agreement provided with the Software.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for** information about Qt Commercial License Agreements.** See http://www.trolltech.com/qpl/ for QPL licensing information.** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "qgroupbox.h"#ifndef QT_NO_GROUPBOX#include "qlayout.h"#include "qpainter.h"#include "qbitmap.h"#include "qaccel.h"#include "qradiobutton.h"#include "qfocusdata.h"#include "qobjectlist.h"#include "qdrawutil.h"#include "qapplication.h"// REVISED: arnt/*! \class QGroupBox qgroupbox.h \brief The QGroupBox widget provides a group box frame with a title. \ingroup organizers 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' child widgets, and the child widgets are arranged in an array inside the frame. The simplest way to use it is to create a group box with the desired number of columns and orientation, and then just create widgets with the group box as parent. However, it is also possible to change the orientation() and number of columns() after construction, or to ignore all the automatic layout support and manage all that yourself. QGroupBox also lets you set the title() (normally set in the constructor) and if you so please, even the title's alignment(). <img src=qgrpbox-w.png> \sa QButtonGroup*//*! Constructs a group box widget with no title. The \e parent and \e name arguments are passed to the QWidget constructor. This constructor does not do automatic layout.*/QGroupBox::QGroupBox( QWidget *parent, const char *name ) : QFrame( parent, name ){ init();}/*! Constructs a group box with a title. The \e parent and \e name arguments are passed to the QWidget constructor. This constructor does not do automatic layout.*/QGroupBox::QGroupBox( const QString &title, QWidget *parent, const char *name ) : QFrame( parent, name ){ init(); setTitle( title );}/*! Constructs a group box with no title. Child widgets will be arranged in \a strips rows or columns (depending on \a orientation). The \e parent and \e name arguments are passed to the QWidget constructor.*/QGroupBox::QGroupBox( int strips, Orientation orientation, QWidget *parent, const char *name ) : QFrame( parent, name ){ init(); setColumnLayout( strips, orientation );}/*! Constructs a group box titled \a title. Child widgets will be arranged in \a strips rows or columns (depending on \a orientation). The \e parent and \e name arguments are passed to the QWidget constructor.*/QGroupBox::QGroupBox( int strips, Orientation orientation, const QString &title, QWidget *parent, const char *name ) : QFrame( parent, name ){ init(); setTitle( title ); setColumnLayout( strips, orientation );}void QGroupBox::init(){ int fs; align = AlignLeft; fs = QFrame::Box | QFrame::Sunken; setFrameStyle( fs );#ifndef QT_NO_ACCEL accel = 0;#endif vbox = 0; grid = 0; d = 0; //we use d directly to store a QSpacerItem lenvisible = 0; nCols = nRows = 0; dir = Horizontal;}void QGroupBox::setTextSpacer(){ QSpacerItem *sp = (QSpacerItem*)d; if ( ! sp ) return; int h = 0; int w = 0; if ( lenvisible ) { QFontMetrics fm = fontMetrics(); h = fm.height(); w = fm.width( str, lenvisible ) + 2*fm.width( "xx" ); if ( layout() ) { int m = layout()->margin(); // do we have a child layout? for ( QLayoutIterator it = layout()->iterator(); it.current(); ++it ) { if ( it.current()->layout() ) { m += it.current()->layout()->margin(); break; } } if ( m > 4 ) h -= m - 4; h = QMAX( 0, h ); } } sp->changeSize( w, h, QSizePolicy::Minimum, QSizePolicy::Fixed );}/*! Sets the group box title text to \a title, and add a focus-change accelerator if the \a title contains & followed by an appropriate letter. This produces "User information" with the U underscored and Alt-U moves the keyboard focus into the group: \code g->setTitle( "&User information" ); \endcode*/void QGroupBox::setTitle( const QString &title ){ if ( str == title ) // no change return; str = title;#ifndef QT_NO_ACCEL if ( accel ) delete accel; accel = 0; int s = QAccel::shortcutKey( title ); if ( s ) { accel = new QAccel( this, "automatic focus-change accelerator" ); accel->connectItem( accel->insertItem( s, 0 ), this, SLOT(fixFocus()) ); }#endif calculateFrame(); setTextSpacer(); if ( layout() ) { layout()->activate(); QSize s( size() ); QSize ms( minimumSizeHint() ); resize( QMAX( s.width(), ms.width() ), QMAX( s.height(), ms.height() ) ); } update(); updateGeometry();}/*! \fn QString QGroupBox::title() const Returns the group box title text.*//*! \fn int QGroupBox::alignment() const Returns the alignment of the group box title. The default alignment is \c AlignLeft. \sa setAlignment(), Qt::AlignmentFlags*//*! Sets the alignment of the group box title. The title is always placed on the upper frame line, however, the horizontal alignment can be specified by the \e alignment parameter. The \e alignment is one of the following flags: <ul> <li> \c AlignLeft aligns the title text to the left. <li> \c AlignRight aligns the title text to the right. <li> \c AlignHCenter aligns the title text centered. </ul> \sa alignment(), Qt::AlignmentFlags*/void QGroupBox::setAlignment( int alignment ){ align = alignment; update();}/*! \reimp*/void QGroupBox::resizeEvent( QResizeEvent *e ){ QFrame::resizeEvent(e); calculateFrame();}/*! \reimp \internal overrides QFrame::paintEvent*/void QGroupBox::paintEvent( QPaintEvent *event ){ QPainter paint( this ); if ( lenvisible ) { // draw title QFontMetrics fm = paint.fontMetrics(); int h = fm.height(); int tw = fm.width( str, lenvisible ) + 2*fm.width(QChar(' ')); int x; if ( align & AlignHCenter ) // center alignment x = frameRect().width()/2 - tw/2; else if ( align & AlignRight ) // right alignment x = frameRect().width() - tw - 8; else // left alignment x = 8; qDrawItem( &paint, style(), x, 0, tw, h, AlignCenter + ShowPrefix, colorGroup(), isEnabled(), 0, str, lenvisible, 0 ); QRect r( x, 0, tw, h ); paint.setClipRegion( event->region().subtract( r ) ); // clip everything but title } drawFrame( &paint ); // draw the frame drawContents( &paint ); // draw the contents}/*! \reimp */void QGroupBox::updateMask(){ QRegion reg( rect() ); int len = str.length(); if ( len ) { QFontMetrics fm = fontMetrics(); int h = fm.height(); int tw = 0; while ( len ) { tw = fm.width( str, len ) + 2 * fm.width( QChar(' ') ); if ( tw < rect().width() ) break; len--; } int x;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -