?? qbutton.cpp
字號:
/****************************************************************************** $Id: qt/src/widgets/qbutton.cpp 2.3.12 edited 2005-10-27 $**** Implementation of QButton widget class**** Created : 940206**** 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 "qbutton.h"#ifndef QT_NO_BUTTON#include "qbuttongroup.h"#include "qbitmap.h"#include "qpainter.h"#include "qtimer.h"#include "qaccel.h"#include "qpixmapcache.h"#include "qfocusdata.h"#include "qapplication.h"#include "qpushbutton.h"#include <ctype.h>static const int autoRepeatDelay = 300;static const int autoRepeatPeriod = 100;#ifdef _WS_QWS_// Small in Qt/Embedded - 5K on 32bppstatic const int drawingPixWidth = 64;static const int drawingPixHeight = 20;#else// 120K on 32bppstatic const int drawingPixWidth = 300;static const int drawingPixHeight = 100;#endif#ifdef QT_KEYPAD_MODEextern bool qt_modalEditingEnabled;#endif/* Returns a pixmap of dimension (drawingPixWidth x drawingPixHeight). The pixmap is used by paintEvent for flicker-free drawing. */static QPixmap *drawpm = 0;static void cleanupButtonPm(){ delete drawpm; drawpm = 0;}static inline void makeDrawingPixmap(){ if ( !drawpm ) { qAddPostRoutine( cleanupButtonPm ); drawpm = new QPixmap( drawingPixWidth, drawingPixHeight ); CHECK_PTR( drawpm ); }}struct QButtonData{ QButtonData() {#ifndef QT_NO_BUTTONGROUP group = 0;#endif#ifndef QT_NO_ACCEL a = 0;#endif }#ifndef QT_NO_BUTTONGROUP QButtonGroup *group;#endif QTimer timer;#ifndef QT_NO_ACCEL QAccel *a;#endif};void QButton::ensureData(){ if ( !d ) { d = new QButtonData; CHECK_PTR( d ); connect(&d->timer, SIGNAL(timeout()), this, SLOT(autoRepeatTimeout())); }}/*! Returns a pointer to the group of which this button is a member. If the button is not a member of any QButtonGroup, this function returns 0. \sa setGroup() QButtonGroup*/QButtonGroup *QButton::group() const{#ifndef QT_NO_BUTTONGROUP return d ? d->group : 0;#else return 0;#endif}void QButton::setGroup( QButtonGroup* g ){#ifndef QT_NO_BUTTONGROUP ensureData(); d->group = g;#endif}QTimer *QButton::timer(){ ensureData(); return &d->timer;}// NOT REVISED/*! \class QButton qbutton.h \brief The QButton class is the abstract base class of button widgets, providing functionality common to buttons. \ingroup abstractwidgets The QButton class implements an abstract button, and lets subclasses specify how to reply to user actions and how to draw the button. QButton provides both push and toggle buttons. The QRadioButton and QCheckBox classes provide only toggle buttons, QPushButton and QToolButton provide both toggle and push buttons. Any button can have either a text or pixmap label. setText() sets the button to be a text button and setPixmap() sets it to be a pixmap button. The text/pixmap is manipulated as necessary to create "disabled" appearance when the button is disabled. QButton provides most of the states used for buttons: <ul> <li>isDown() determines whether the button is \e pressed down. <li>isOn() determines whether the button is \e on. Only toggle buttons can be switched on and off (see below). <li>isEnabled() determines whether the button can be pressed by the user. <li>setAutoRepeat() determines whether the button will auto-repeat if the user holds it down. <li>setToggleButton() determines whether the button is a toggle button or not. </ul> The difference between isDown() and isOn() is as follows: When the user clicks a toggle button to toggle it on, the button is first \e pressed, then released into \e on state. When the user clicks it again (to toggle it off) the button moves first to the \e pressed state, then to the \e off state (isOn() and isDown() are both FALSE). Default buttons (as used in many dialogs) are provided by QPushButton::setDefault() and QPushButton::setAutoDefault(). QButton provides four signals: <ul> <li>pressed() is emitted when the left mouse button is pressed while the mouse cursor is inside the button. <li>released() is emitted when the left mouse button is released. <li>clicked() is emitted when the button is first pressed then released, or when the accelerator key is typed, or when animateClick() is called. <li>toggled(bool) is emitted when the state of a toggle button changes. <li>stateChanged(int) is emitted when the state of a tristate toggle button changes. </ul> If the button is a text button with "&" in its text, QButton creates an automatic accelerator key. This code creates a push button labelled "Rock & Roll" (where the c is underscored). The button gets an automatic accelerator key, Alt-C: \code QPushButton *p = new QPushButton( "Ro&ck && Roll", this ); \endcode In this example, when the user presses Alt-C the button will call animateClick(). You can also set a custom accelerator using the setAccel() function. This is useful mostly for pixmap buttons since they have no automatic accelerator. \code QPushButton *p; p->setPixmap( QPixmap("print.png") ); p->setAccel( ALT+Key_F7 ); \endcode All of the buttons provided by Qt (\l QPushButton, \l QToolButton, \l QCheckBox and \l QRadioButton) can display both text and pixmaps. To subclass QButton, you have to reimplement at least drawButton() (to draw the button's outskirts) and drawButtonLabel() (to draw its text or pixmap). It is generally advisable to reimplement sizeHint() as well, and sometimes hitButton() (to determine whether a button press is within the button). To reduce flickering the QButton::paintEvent() sets up a pixmap that the drawButton() function draws in. You should not reimplement paintEvent() for a subclass of QButton unless you want to take over all drawing. \sa QButtonGroup*//*! \enum QButton::ToggleType This enum type defines what a button can do in response to a mouse/keyboard press: <ul> <li> \c SingleShot - pressing the button causes an action, then the button returns to the unpressed state. <li> \c Toggle - pressing the button toggles it between an \c On and and \c Off state. <li> \c Tristate - pressing the button cycles between the three states \c On, \c Off and \c NoChange </ul>*//*! \enum QButton::ToggleState This enum defines the state of a toggle button at any moment. The possible values are: <ul> <li> \c Off - the button is in the "off" state <li> \c NoChange - the button is in the default/unchanged state <li> \c On - the button is in the "on" state </ul>*//*! Constructs a standard button with a parent widget and a name. If \a parent is a QButtonGroup, this constructor calls QButtonGroup::insert().*/QButton::QButton( QWidget *parent, const char *name, WFlags f ) : QWidget( parent, name, f ){ bpixmap = 0; toggleTyp = SingleShot; // button is simple buttonDown = FALSE; // button is up stat = Off; // button is off mlbDown = FALSE; // mouse left button up autoresize = FALSE; // not auto resizing animation = FALSE; // no pending animateClick repeat = FALSE; // not in autorepeat mode d = 0;#ifndef QT_NO_BUTTONGROUP if ( parent && parent->inherits("QButtonGroup") ) { setGroup((QButtonGroup*)parent); group()->insert( this ); // insert into button group }#endif setFocusPolicy( TabFocus );}/*! Destructs the button, deleting all its child widgets.*/QButton::~QButton(){#ifndef QT_NO_BUTTONGROUP if ( group() ) group()->remove( this );#endif delete bpixmap; delete d;}/*! \fn void QButton::pressed() This signal is emitted when the button is pressed down. \sa released(), clicked()*//*! \fn void QButton::released() This signal is emitted when the button is released. \sa pressed(), clicked(), toggled()*//*! \fn void QButton::clicked() This signal is emitted when the button is activated, i.e. first pressed down and then released when the mouse cursor is inside the button, or when the accelerator key is typed, or when animateClick() is called. \sa pressed(), released(), toggled()*//*! \fn void QButton::toggled( bool on ) This signal is emitted whenever a toggle button changes status. \e on is TRUE if the button is on, or FALSE if the button is off. This may be the result of a user action, toggle() slot activation, or because setOn() was called. \sa clicked()*//*! \fn void QButton::stateChanged( int state ) This signal is emitted whenever a toggle button changes status. \e state is 2 if the button is on, 1 if it is in the \link QCheckBox::setTristate() "no change" state\endlink or 0 if the button is off. This may be the result of a user action, toggle() slot activation, setState(), or because setOn() was called. \sa clicked()*//*! \fn QString QButton::text() const Returns the button text, or \link QString::operator!() null string\endlink if the button has no text. \sa setText()*//*! Sets the button to display \e text. If the text contains an ampersand, QButton creates an automatic accelerator for it, such as Alt-c for "&Cancel". \sa text(), setPixmap(), setAccel(), QPixmap::mask()*/void QButton::setText( const QString &text ){ if ( btext == text ) return; btext = text; if ( bpixmap ) { delete bpixmap; bpixmap = 0; } if ( autoresize ) adjustSize();#ifndef QT_NO_ACCEL setAccel( QAccel::shortcutKey( btext ) );#endif update(); updateGeometry();}/*! \fn const QPixmap *QButton::pixmap() const Returns the button pixmap, or 0 if the button has no pixmap.*//*! Sets the button to display \a pixmap If \a pixmap is monochrome (i.e. it is a QBitmap or its \link QPixmap::depth() depth\endlink is 1) and it does not have a mask, this function sets the pixmap to be its own mask. The purpose of this is to draw transparent bitmaps, which is important for e.g. toggle buttons. \sa pixmap(), setText(), setAccel(), QPixmap::mask()*/void QButton::setPixmap( const QPixmap &pixmap ){ if ( bpixmap && bpixmap->serialNumber() == pixmap.serialNumber() ) return; bool newSize; if ( bpixmap ) { newSize = pixmap.width() != bpixmap->width() || pixmap.height() != bpixmap->height(); *bpixmap = pixmap; } else { newSize = TRUE; bpixmap = new QPixmap( pixmap ); CHECK_PTR( bpixmap ); } if ( bpixmap->depth() == 1 && !bpixmap->mask() ) bpixmap->setMask( *((QBitmap *)bpixmap) ); if ( !btext.isNull() ) btext = QString::null; if ( autoresize && newSize ) adjustSize(); setAccel( 0 ); if ( autoMask() ) updateMask(); update(); updateGeometry();}/*! Returns the accelerator key currently set for the button, or 0 if no accelerator key has been set. \sa setAccel()*/int QButton::accel() const{#ifndef QT_NO_ACCEL return d && d->a ? d->a->key( 0 ) : 0;#else return 0;#endif}/*! Specifies an accelerator \a key for the button, or removes the accelerator if \a key is 0. Setting a button text containing a shortcut character (for example the 'x' in E&xit) automatically defines an ALT+letter accelerator for the button. You only need to call this function in order to specify a custom accelerator. Example: \code QPushButton *b1 = new QPushButton; b1->setText( "&OK" ); // sets accel ALT+'O' QPushButton *b2 = new QPushButton; b2->setPixmap( printIcon ); // pixmap instead of text b2->setAccel( CTRL+'P' ); // custom accel \endcode \sa accel(), setText(), QAccel*/void QButton::setAccel( int key ){#ifndef QT_NO_ACCEL if ( d && d->a ) d->a->clear(); if ( !key ) return; ensureData(); if ( !d->a ) d->a = new QAccel( this, "buttonAccel" ); d->a->connectItem( d->a->insertItem( key, 0 ), this, SLOT(animateClick()) );#endif}/*! \fn bool QButton::autoResize() const \obsolete Strange pre-layout stuff. Returns TRUE if auto-resizing is enabled, or FALSE if auto-resizing is disabled. Auto-resizing is disabled by default. \sa setAutoResize()*//*!\obsolete Strange pre-layout stuff. Enables auto-resizing if \e enable is TRUE, or disables it if \e enable is FALSE. When auto-resizing is enabled, the button will resize itself whenever the contents change. \sa autoResize(), adjustSize()*/void QButton::setAutoResize( bool enable ){ if ( (bool)autoresize != enable ) { autoresize = enable; if ( autoresize ) adjustSize(); // calls resize which repaints }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -