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

📄 stopwatch.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ 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 "stopwatch.h"#include "analogclock.h"#include <qtopia/qpeapplication.h>#ifdef QWS#include <qtopia/qcopenvelope_qws.h>#endif#include <qtopia/config.h>#include <qtopia/timestring.h>#include <qtopia/alarmserver.h>#include <qtopia/sound.h>#include <qtopia/resource.h>#include <qtopia/global.h>#include <qlcdnumber.h>#include <qlabel.h>#include <qtimer.h>#include <qpushbutton.h>#include <qtoolbutton.h>#include <qpainter.h>#include <qtabwidget.h>#include <qspinbox.h>#include <qcombobox.h>#include <qcheckbox.h>#include <qgroupbox.h>#include <qmessagebox.h>#include <qtimer.h>#include <qlayout.h>#include <qhbox.h>#include <qlineedit.h>static const int sw_prec = 2;static const int magic_daily = 2292922;static const int magic_countdown = 2292923;static void toggleScreenSaver( bool on ){    QPEApplication::setTempScreenSaverMode(on ? QPEApplication::Enable : QPEApplication::DisableSuspend);  }StopWatch::StopWatch( QWidget * parent, const char *, WFlags f )    : StopWatchBase( parent, "clock", f ), swatch_splitms(99) // No tr{    swLayout = 0;    analogStopwatch = new AnalogClock( swFrame );    stopwatchLcd = new QLCDNumber( swFrame );    stopwatchLcd->setFrameStyle( QFrame::NoFrame );    stopwatchLcd->setSegmentStyle( QLCDNumber::Flat );    stopwatchLcd->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred) );    if ( qApp->desktop()->height() > 240 )	stopwatchLcd->setFixedHeight( 30 );    connect( stopStart, SIGNAL(pressed()), SLOT(stopStartStopWatch()) );    connect( reset, SIGNAL(pressed()), SLOT(resetStopWatch()) );#ifdef QTOPIA_PHONE    if (!Global::mousePreferred()) {	stopStart->setText("* " + stopStart->text());	stopStart->setAccel(Key_Asterisk);	reset->setText(reset->text()+" #");	reset->setAccel(Key_NumberSign);	stopStart->setFocusPolicy(NoFocus);	reset->setFocusPolicy(NoFocus);    }#endif    t = new QTimer( this );    connect( t, SIGNAL(timeout()), SLOT(updateClock()) );    connect( qApp, SIGNAL(timeChanged()), SLOT(updateClock()) );    swatch_running = FALSE;    swatch_totalms = 0;    swatch_currLap = 0;    swatch_dispLap = 0;    stopwatchLcd->setNumDigits( 8+1+sw_prec );    QVBoxLayout *lvb = new QVBoxLayout( lapFrame );    nextLapBtn = new QToolButton( UpArrow, lapFrame );    connect( nextLapBtn, SIGNAL(clicked()), this, SLOT(nextLap()) );    nextLapBtn->setAccel( Key_Up );    lvb->addWidget( nextLapBtn );    prevLapBtn = new QToolButton( DownArrow, lapFrame );    connect( prevLapBtn, SIGNAL(clicked()), this, SLOT(prevLap()) );    prevLapBtn->setAccel( Key_Down );    prevLapBtn->setMinimumWidth( 15 );    lvb->addWidget( prevLapBtn );    prevLapBtn->setEnabled( FALSE );    nextLapBtn->setEnabled( FALSE );#ifdef QTOPIA_PHONE    nextLapBtn->setFocusPolicy ( NoFocus );//    prevLapBtn->setFocusPolicy ( NoFocus );#endif    reset->setEnabled( FALSE );    lapLcd->setNumDigits( 8+1+sw_prec );    splitLcd->setNumDigits( 8+1+sw_prec );    lapNumLcd->display( 1 );    lapTimer = new QTimer( this );    connect( lapTimer, SIGNAL(timeout()), this, SLOT(lapTimeout()) );    for (uint s = 0; s < swatch_splitms.count(); s++ )	swatch_splitms[(int)s] = 0;    connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(changeClock(bool)) );    swFrame->installEventFilter( this );    updateClock();}StopWatch::~StopWatch(){    toggleScreenSaver( true );}void StopWatch::updateClock(){    int totalms = swatch_totalms;    if ( swatch_running )	totalms += swatch_start.elapsed();    setSwatchLcd( stopwatchLcd, totalms, !swatch_running );    QTime swatch_time = QTime(0,0,0).addMSecs(totalms);    analogStopwatch->display( swatch_time );    if ( swatch_dispLap == swatch_currLap ) {	swatch_splitms[swatch_currLap] = swatch_totalms;	if ( swatch_running )	    swatch_splitms[swatch_currLap] += swatch_start.elapsed();	updateLap();    }}void StopWatch::changeClock( bool ){    updateClock();}void StopWatch::stopStartStopWatch(){    if ( swatch_running ) {	swatch_totalms += swatch_start.elapsed();	swatch_splitms[swatch_currLap] = swatch_totalms;	stopStart->setText( tr("Start") );	reset->setText( tr("Reset") );#ifdef QTOPIA_PHONE	if (!Global::mousePreferred()) {	    stopStart->setText("* " + stopStart->text());	    stopStart->setAccel(Key_Asterisk);	    reset->setText(reset->text()+" #");	    reset->setAccel(Key_NumberSign);	}#endif	reset->setEnabled( TRUE );	t->stop();	swatch_running = FALSE;	toggleScreenSaver( TRUE );	updateClock();    } else {	swatch_start.start();	stopStart->setText( tr("Stop") );	reset->setText( tr("Lap/Split") );#ifdef QTOPIA_PHONE	if (!Global::mousePreferred()) {	    stopStart->setText("* " + stopStart->text());	    stopStart->setAccel(Key_Asterisk);	    reset->setText(reset->text()+" #");	    reset->setAccel(Key_NumberSign);	}#endif	reset->setEnabled( swatch_currLap < 98 );        t->start( 1000 );	swatch_running = TRUE;	// disable screensaver while stop watch is running	toggleScreenSaver( FALSE );    }    swatch_dispLap = swatch_currLap;    updateLap();    prevLapBtn->setEnabled( swatch_dispLap );    nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );#ifndef QTOPIA_PHONE    stopStart->setAccel( Key_Return );#endif}void StopWatch::resetStopWatch(){    if ( swatch_running ) {	swatch_splitms[swatch_currLap] = swatch_totalms+swatch_start.elapsed();	swatch_dispLap = swatch_currLap;	if ( swatch_currLap < 98 )  // allow up to 99 laps	    swatch_currLap++;	reset->setEnabled( swatch_currLap < 98 );	updateLap();	lapTimer->start( 2000, TRUE );    } else {	swatch_start.start();	swatch_totalms = 0;	swatch_currLap = 0;	swatch_dispLap = 0;	for ( uint i = 0; i < swatch_splitms.count(); i++ )	    swatch_splitms[(int)i] = 0;	updateLap();	updateClock();	reset->setText( tr("Lap/Split") );	reset->setEnabled( FALSE );    }    prevLapBtn->setEnabled( swatch_dispLap );    nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );}void StopWatch::prevLap(){    if ( swatch_dispLap > 0 ) {	swatch_dispLap--;	updateLap();	prevLapBtn->setEnabled( swatch_dispLap );	nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );    }}void StopWatch::nextLap(){    if ( swatch_dispLap < swatch_currLap ) {	swatch_dispLap++;	updateLap();	prevLapBtn->setEnabled( swatch_dispLap );	nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );    }}void StopWatch::lapTimeout(){    swatch_dispLap = swatch_currLap;    updateLap();    prevLapBtn->setEnabled( swatch_dispLap );    nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );}void StopWatch::updateLap(){    if ( swatch_running && swatch_currLap == swatch_dispLap ) {	swatch_splitms[swatch_currLap] = swatch_totalms;	swatch_splitms[swatch_currLap] += swatch_start.elapsed();    }    int split = swatch_splitms[swatch_dispLap];    int lap;    if ( swatch_dispLap > 0 )	lap = swatch_splitms[swatch_dispLap] - swatch_splitms[swatch_dispLap-1];    else	lap = swatch_splitms[swatch_dispLap];    lapNumLcd->display( swatch_dispLap+1 );    bool showMs = !swatch_running || swatch_dispLap!=swatch_currLap;    setSwatchLcd( lapLcd, lap, showMs );    setSwatchLcd( splitLcd, split, showMs );}void StopWatch::setSwatchLcd( QLCDNumber *lcd, int ms, bool showMs ){    QTime swatch_time = QTime(0,0,0).addMSecs(ms);    QString d = showMs ? QString::number(ms%1000+1000) : QString("    ");    QString lcdtext = swatch_time.toString() + "." + d.right(3).left(sw_prec);    lcd->display( lcdtext );    lcd->repaint( FALSE );}bool StopWatch::eventFilter( QObject *o, QEvent *e ){    if ( o == swFrame && e->type() == QEvent::Resize ) {	QResizeEvent *re = (QResizeEvent *)e;	delete swLayout;	if ( re->size().height() < 80 || re->size().height()*3 < re->size().width() )	    swLayout = new QHBoxLayout( swFrame );	else	    swLayout = new QVBoxLayout( swFrame );	swLayout->addWidget( analogStopwatch );	swLayout->addWidget( stopwatchLcd );	swLayout->activate();    }    return FALSE;}void StopWatch::showEvent(QShowEvent *e){    StopWatchBase::showEvent(e);    updateClock();}

⌨️ 快捷键说明

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