⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qpestyle.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** 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 "qpestyle.h"#include "qpeapplication.h"#include <qpushbutton.h>#include <qpainter.h>#include <qimage.h>#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2)#if QT_VERSION >= 0x030000#include <qdrawutil.h>#include <qcombobox.h>#include <qtabbar.h>/*!  \class QPEStyle qpestyle.h  \brief The QPEStyle class implements the default Qtopia widget style.  \ingroup qtopiaemb*/// QDOC_SKIP_BEGIN/*! */QPEStyle::QPEStyle(){}/*! */QPEStyle::~QPEStyle(){}/*! \a pe \a p \a r \a cg \a flags \a data */void QPEStyle::drawPrimitive( PrimitiveElement pe, QPainter *p, const QRect &r,			      const QColorGroup &cg, SFlags flags, const QStyleOption &data) const{    switch ( pe ) {    case PE_ButtonTool:	{	    QColorGroup mycg = cg;	    if ( flags & Style_On ) {		QBrush fill( cg.mid(), Dense4Pattern );		mycg.setBrush( QColorGroup::Button, fill );	    }	    drawPrimitive( PE_ButtonBevel, p, r, mycg, flags, data );	    break;	}    case PE_ButtonCommand:    case PE_ButtonDefault:    case PE_ButtonBevel:    case PE_HeaderSection:	{	    QPen oldPen = p->pen();	    p->fillRect( r.x()+1, r.y()+1, r.width()-2, r.height()-2, cg.brush(QColorGroup::Button) );	    int x2 = r.right();	    int y2 = r.bottom();	    if ( flags & (Style_Sunken | Style_Down | Style_On) )		p->setPen( cg.dark() );	    else		p->setPen( cg.light() );	    p->drawLine( r.x(), r.y()+1, r.x(), y2-1 );	    p->drawLine( r.x()+1, r.y(), x2-1, r.y() );	    if ( flags & (Style_Sunken | Style_Down | Style_On) )		p->setPen( cg.light() );	    else		p->setPen( cg.dark() );	    p->drawLine( x2, r.y()+1, x2, y2-1 );	    p->drawLine( r.x()+1, y2, x2-1, y2 );	    p->setPen( oldPen );	    break;	}    case PE_FocusRect:	break;    case PE_Indicator:	{	    QColorGroup mycg( cg );	    QBrush fill;	    if ( flags & Style_Down )		fill = cg.brush( QColorGroup::Button );	    else		fill = cg.brush( (flags&Style_Enabled) ? QColorGroup::Base : QColorGroup::Background );	    mycg.setBrush( QColorGroup::Button, fill );	    if ( flags&Style_Enabled )		flags |= Style_Sunken;	    drawPrimitive( PE_ButtonBevel, p, r, mycg, flags );	    if ( flags & Style_On ) {		QPointArray a( 7*2 );		int i, xx, yy;		xx = r.x()+3;		yy = r.y()+5;		for ( i=0; i<3; i++ ) {		    a.setPoint( 2*i,   xx, yy );		    a.setPoint( 2*i+1, xx, yy+2 );		    xx++; yy++;		}		yy -= 2;		for ( i=3; i<7; i++ ) {		    a.setPoint( 2*i,   xx, yy );		    a.setPoint( 2*i+1, xx, yy+2 );		    xx++; yy--;		}		if ( flags & Style_NoChange ) {		    p->setPen( mycg.dark() );		} else {		    p->setPen( mycg.text() );		}		p->drawLineSegments( a );	    }	    break;	}    case PE_ExclusiveIndicator:	{	    static const QCOORD pts1[] = {              // dark lines		1,9, 1,8, 0,7, 0,4, 1,3, 1,2, 2,1, 3,1, 4,0, 7,0, 8,1, 9,1 };	    static const QCOORD pts4[] = {              // white lines		2,10, 3,10, 4,11, 7,11, 8,10, 9,10, 10,9, 10,8, 11,7,		11,4, 10,3, 10,2 };	    static const QCOORD pts5[] = {              // inner fill		4,2, 7,2, 9,4, 9,7, 7,9, 4,9, 2,7, 2,4 };	    int x, y, w, h;	    r.rect( &x, &y, &w, &h );	    p->eraseRect( x, y, w, h );	    QPointArray a( QCOORDARRLEN(pts1), pts1 );	    a.translate( x, y );	    p->setPen( cg.dark() );	    p->drawPolyline( a );	    a.setPoints( QCOORDARRLEN(pts4), pts4 );	    a.translate( x, y );	    p->setPen( cg.light() );	    p->drawPolyline( a );	    a.setPoints( QCOORDARRLEN(pts5), pts5 );	    a.translate( x, y );	    QColor fillColor = ( flags&Style_Down || !(flags&Style_Enabled) ) ? cg.button() : cg.base();	    p->setPen( fillColor );	    p->setBrush( fillColor  ) ;	    p->drawPolygon( a );	    if ( flags&Style_On ) {		p->setPen( NoPen );		p->setBrush( cg.text() );		p->drawRect( x+5, y+4, 2, 4 );		p->drawRect( x+4, y+5, 4, 2 );	    }	    break;	}    default:	QWindowsStyle::drawPrimitive( pe, p, r, cg, flags, data );	break;    }}/*! \a ce \a p \a widget \a r \a cg \a how \a data */void QPEStyle::drawControl( ControlElement ce, QPainter *p,			    const QWidget *widget, const QRect &r,			    const QColorGroup &cg, SFlags how, const QStyleOption &data) const{    switch ( ce ) {    case CE_PushButton:	{	    const QPushButton *btn = (QPushButton*)widget;	    SFlags flags;	    flags = Style_Default;	    if ( btn->isDown() )		flags |= Style_Down;	    if ( btn->isOn() )		flags |= Style_On;	    if ( btn->isEnabled() )		flags |= Style_Enabled;	    if ( btn->isDefault() )		flags |= Style_Default;	    if (! btn->isFlat() && !(flags & Style_Down))		flags |= Style_Raised;	    p->setPen( cg.foreground() );	    p->setBrush( QBrush(cg.button(), NoBrush) );	    QColorGroup mycg( cg );	    if ( flags & Style_On ) {		QBrush fill = QBrush( cg.mid(), Dense4Pattern );		mycg.setBrush( QColorGroup::Button, fill );	    }	    drawPrimitive( PE_ButtonBevel, p, r, mycg, flags, data );	    break;	}    case CE_TabBarTab:	{	    if ( !widget || !widget->parentWidget() )		break;	    const QTabBar *tb = (const QTabBar *) widget;	    bool selected = how & Style_Selected;	    QRect r2(r);	    if ( tb->shape()  == QTabBar::RoundedAbove ) {		p->setPen( cg.light() );		p->drawLine( r2.left(), r2.bottom(), r2.right(), r2.bottom() );		if ( r2.left() == 0 )		    p->drawPoint( tb->rect().bottomLeft() );		else {		    p->setPen( cg.light() );		    p->drawLine( r2.left(), r2.bottom(), r2.right(), r2.bottom() );		}		if ( selected ) {		    p->setPen( cg.background() );		    p->drawLine( r2.left()+2, r2.top()+1, r2.right()-2, r2.top()+1 );		    p->fillRect( QRect( r2.left()+1, r2.top()+2, r2.width()-2, r2.height()-2),			    cg.brush( QColorGroup::Background ));		} else {		    r2.setRect( r2.left() + 2, r2.top() + 2,			    r2.width() - 4, r2.height() - 2 );		    p->setPen( cg.button() );		    p->drawLine( r2.left()+2, r2.top()+1, r2.right()-2, r2.top()+1 );		    p->fillRect( QRect( r2.left()+1, r2.top()+2, r2.width()-2, r2.height()-3),			    cg.brush( QColorGroup::Button ));		    //do shading; will not work for pixmap brushes		    QColor bg = cg.button(); 		    //	    int h,s,v;		    //	    bg.hsv( &h, &s, &v );		    int n = r2.height()/2;		    int dark = 100;		    for ( int i = 1; i < n; i++ ) {			dark = (dark * (100+(i*15)/n) )/100;			p->setPen( bg.dark( dark ) );			int y = r2.bottom()-n+i;			int x1 = r2.left()+1;			int x2 = r2.right()-1;			p->drawLine( x1, y, x2, y );		    }		}		p->setPen( cg.light() );		p->drawLine( r2.left(), r2.bottom()-1, r2.left(), r2.top() + 2 );		p->drawPoint( r2.left()+1, r2.top() + 1 );		p->drawLine( r2.left()+2, r2.top(),			r2.right() - 2, r2.top() );		p->setPen( cg.dark() );		p->drawPoint( r2.right() - 1, r2.top() + 1 );		p->drawLine( r2.right(), r2.top() + 2, r2.right(), r2.bottom() - 1);	    } else if ( tb->shape() == QTabBar::RoundedBelow ) {		if ( selected ) {		    p->setPen( cg.background() );		    p->drawLine( r2.left()+2, r2.bottom()-1, r2.right()-2, r2.bottom()-1 );		    p->fillRect( QRect( r2.left()+1, r2.top(), r2.width()-2, r2.height()-2),			    tb->palette().normal().brush( QColorGroup::Background ));		} else {		    p->setPen( cg.dark() );		    p->drawLine( r2.left(), r2.top(),			    r2.right(), r2.top() );		    r2.setRect( r2.left() + 2, r2.top(),			    r2.width() - 4, r2.height() - 2 );		    p->setPen( cg.button() );		    p->drawLine( r2.left()+2, r2.bottom()-1, r2.right()-2, r2.bottom()-1 );		    p->fillRect( QRect( r2.left()+1, r2.top()+1, r2.width()-2, r2.height()-3),			    tb->palette().normal().brush( QColorGroup::Button ));		}		p->setPen( cg.dark() );		p->drawLine( r2.right(), r2.top(),			r2.right(), r2.bottom() - 2 );		p->drawPoint( r2.right() - 1, r2.bottom() - 1 );		p->drawLine( r2.right() - 2, r2.bottom(),			r2.left() + 2, r2.bottom() );		p->setPen( cg.light() );		p->drawLine( r2.left(), r2.top()+1,			r2.left(), r2.bottom() - 2 );		p->drawPoint( r2.left() + 1, r2.bottom() - 1 );		if ( r2.left() == 0 )		    p->drawPoint( tb->rect().topLeft() );	    } else {		QCommonStyle::drawControl( ce, p, widget, r, cg, how, data );	    }	    break;	}    default:	QWindowsStyle::drawControl( ce, p, widget, r, cg, how, data );	break;    }}/*! \a control \a p \a widget \a r \a cg \a how \a sub \a subActive \a data */void QPEStyle::drawComplexControl( ComplexControl control, QPainter *p,				   const QWidget *widget, const QRect &r,				   const QColorGroup &cg, SFlags how,				   SCFlags sub, SCFlags subActive, const QStyleOption &data) const{    switch ( control ) {    case CC_ComboBox:	if ( sub & SC_ComboBoxArrow ) {	    SFlags flags = Style_Default;	    drawPrimitive( PE_ButtonBevel, p, r, cg, flags, data );	    QRect ar =		QStyle::visualRect( querySubControlMetrics( CC_ComboBox, widget,							    SC_ComboBoxArrow ), widget );	    if ( subActive == SC_ComboBoxArrow ) {		p->setPen( cg.dark() );		p->setBrush( cg.brush( QColorGroup::Button ) );		p->drawRect( ar );	    }	    ar.addCoords( 2, 2, -2, -2 );	    if ( widget->isEnabled() )		flags |= Style_Enabled;	    if ( subActive & Style_Sunken ) {		flags |= Style_Sunken;	    }	    drawPrimitive( PE_ArrowDown, p, ar, cg, flags );	}	if ( sub & SC_ComboBoxEditField ) {	    const QComboBox * cb = (const QComboBox *) widget;	    QRect re =		QStyle::visualRect( querySubControlMetrics( CC_ComboBox, widget,							    SC_ComboBoxEditField ), widget );	    if ( cb->hasFocus() && !cb->editable() )		p->fillRect( re.x(), re.y(), re.width(), re.height(),			     cg.brush( QColorGroup::Highlight ) );	    if ( cb->hasFocus() ) {		p->setPen( cg.highlightedText() );		p->setBackgroundColor( cg.highlight() );	    } else {		p->setPen( cg.text() );		p->setBackgroundColor( cg.background() );	    }	    if ( cb->hasFocus() && !cb->editable() ) {		QRect re =		    QStyle::visualRect( subRect( SR_ComboBoxFocusRect, cb ), widget );		drawPrimitive( PE_FocusRect, p, re, cg, Style_FocusAtBorder, QStyleOption(cg.highlight()));	    }	}	break;    default:	QWindowsStyle::drawComplexControl( control, p, widget, r, cg, how,					   sub, subActive, data );	break;    }}/*! \a metric \a widget */int QPEStyle::pixelMetric( PixelMetric metric, const QWidget *widget ) const{    int ret;    switch( metric ) {	case PM_ButtonMargin:	    ret = 2;	    break;	case PM_DefaultFrameWidth:	    ret = 1;	    break;	case PM_ButtonDefaultIndicator:	    ret = 2;	    break;	case PM_ButtonShiftHorizontal:	case PM_ButtonShiftVertical:	    ret = -1;	    break;	case PM_IndicatorWidth:	    ret = 15;	    break;	case PM_IndicatorHeight:	    ret = 13;	    break;	case PM_ExclusiveIndicatorHeight:	case PM_ExclusiveIndicatorWidth:	    ret = 15;	    break;	case PM_ScrollBarExtent:	    ret = 13;	    break;	case PM_SliderLength:	    ret = 12;	    break;	default:	    ret = QWindowsStyle::pixelMetric( metric, widget );	    break;    }    return ret;}/*! \a contents \a widget \a contentsSize \a data */QSize QPEStyle::sizeFromContents( ContentsType contents, const QWidget *widget,				const QSize &contentsSize, const QStyleOption &data) const{    QSize sz(contentsSize);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -