• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            QT定時(shí)器QTimer

            在Qt中使用定時(shí)器有兩種方法,一種是使用QObiect類(lèi)的定時(shí)器;一種是使用QTimer類(lèi)。定時(shí)器的精確性依賴(lài)于操作系統(tǒng)和硬件,大多數(shù)平臺(tái)支持20ms的精確度。

            1.QObject類(lèi)的定時(shí)器

                QObject是所有Qt對(duì)象的基類(lèi),它提供了一個(gè)基本的定時(shí)器。通過(guò)QObject::startTimer(),可以把一個(gè)一毫秒為單位的時(shí)間間隔作為參數(shù)來(lái)開(kāi)始定時(shí)器,這個(gè)函數(shù)返回一個(gè)唯一的整數(shù)定時(shí)器的標(biāo)識(shí)符。這個(gè)定時(shí)器開(kāi)始就會(huì)在每一個(gè)時(shí)間間隔"觸發(fā)",直到明確的使用這個(gè)定時(shí)器的標(biāo)識(shí)符來(lái)調(diào)用QObject::killTimer()結(jié)束。

                當(dāng)定時(shí)器觸發(fā)時(shí),應(yīng)用程序會(huì)發(fā)送一個(gè)QTimerEvent。在事件循環(huán)中,處理器按照事件隊(duì)列的順序來(lái)處理定時(shí)器事件。當(dāng)處理器正忙于其它事件處理時(shí),定時(shí)器就不能立即處理。

                QObject類(lèi)還提供定時(shí)期的功能。與定時(shí)器相關(guān)的成員函數(shù)有:startTimer()、timeEvent()、killTimer()。QObject基類(lèi)中的startTimer()和timerEvent()原型及說(shuō)明如下:

            intQObject::startTimer(int interval);

                開(kāi)始一個(gè)定時(shí)器并返回定時(shí)器ID,如果不能開(kāi)始一個(gè)定時(shí)器,將返回0。定時(shí)器開(kāi)始后,每隔interval毫秒間隔將觸發(fā)一次超時(shí)事件,直到killTimer()被調(diào)用來(lái)刪除定時(shí)器。如果interval為0,那么定時(shí)器事件每次發(fā)生時(shí)沒(méi)有窗口系統(tǒng)事件處理。

            virtual voidQObject::timerEvent(QTimerEvent *event);

                虛函數(shù)timerEvent()被重載來(lái)實(shí)現(xiàn)用戶(hù)的超時(shí)事件處理函數(shù)。如果有多個(gè)定時(shí)器在運(yùn)行,QTimerEvent::timerId()被用來(lái)查找指定定時(shí)器,對(duì)其進(jìn)行操作。

                當(dāng)定時(shí)器事件發(fā)生時(shí),虛函數(shù)timerEvent()隨著QTimerEvent事件參數(shù)類(lèi)一起被調(diào)用,重載這個(gè)函數(shù)可以獲得定時(shí)器事件。

                定時(shí)器的用法如下:

            //頭文件

            class QNewObject : publicQObject

            {

                Q_OBJECT

            public:

                QNewObject( QObject * parent = 0 );

                virtual ~QNewObject();

            protected:

                void timerEvent( QTimerEvent *event );

                int m_nTimerId;

            };

            //源文件

            QNewObject::QNewObject(QObject * parent )

                :QNewObject( parent )

            {

                m_nTimerId = startTimer(1000);

            }

            QNewObject::~QNewObject()

            {

                if ( m_nTimerId != 0 )

                    killTimer(m_nTimerId);

            }

            voidQNewObject::timerEvent( QTimerEvent *event )

            {

                qDebug( "timer event, id %d",event->timerId() );

            }

            2.定時(shí)器類(lèi)QTimer

             定時(shí)器類(lèi)QTimer提供當(dāng)定時(shí)器觸發(fā)的時(shí)候發(fā)射一個(gè)信號(hào)的定時(shí)器,他提供只觸發(fā)一次的超時(shí)事件,通常的使用方法如下:

            //創(chuàng)建定時(shí)器

            QTimer *testTimer = newQTimer(this);

            //將定時(shí)器超時(shí)信號(hào)與槽(功能函數(shù))聯(lián)系起來(lái)

            connect( testTimer,SIGNAL(timeout()), this, SLOT(testFunction()) );

            //開(kāi)始運(yùn)行定時(shí)器,定時(shí)時(shí)間間隔為1000ms

            testTimer->start(1000);

            ...

            //停止運(yùn)行定時(shí)器

            if (testTimer->isActive() )

                testTimer->stop();

              QTimer還提供了一個(gè)簡(jiǎn)單的只有一次定時(shí)的函數(shù)singleShot()。 一個(gè)定時(shí)器在100ms后觸發(fā)處理函數(shù)animateTimeout()并且只觸發(fā)一次。代碼如下:

            QTimer::singleShot( 100,this, SLOT(animateTimeout()) );

            QTimer類(lèi)提供了定時(shí)器信號(hào)和單觸發(fā)定時(shí)器。

            它在內(nèi)部使用定時(shí)器事件來(lái)提供更通用的定時(shí)器。QTimer很容易使用:創(chuàng)建一個(gè)QTimer,使用start()來(lái)開(kāi)始并且把它的timeout()連接到適當(dāng)?shù)牟邸.?dāng)這段時(shí)間過(guò)去了,它將會(huì)發(fā)射timeout()信號(hào)。

            注意當(dāng)QTimer的父對(duì)象被銷(xiāo)毀時(shí),它也會(huì)被自動(dòng)銷(xiāo)毀。

            實(shí)例:

                    QTimer *timer = new QTimer( myObject );

                    connect( timer, SIGNAL(timeout()),myObject, SLOT(timerDone()) );

                    timer->start( 2000, TRUE ); // 2秒單觸發(fā)定時(shí)器

            你也可以使用靜態(tài)的singleShot()函數(shù)來(lái)創(chuàng)建單觸發(fā)定時(shí)器。

            作為一個(gè)特殊情況,一旦窗口系統(tǒng)事件隊(duì)列中的所有事件都已經(jīng)被處理完,一個(gè)定時(shí)為0的QTimer就會(huì)到時(shí)間了。

            這也可以用來(lái)當(dāng)提供迅速的用戶(hù)界面時(shí)來(lái)做比較繁重的工作。

                    QTimer *t = new QTimer( myObject );

                    connect( t, SIGNAL(timeout()), SLOT(processOneThing()));

                    t->start( 0, FALSE );

            myObject->processOneThing()將會(huì)被重復(fù)調(diào)用并且應(yīng)該很快返回(通常在處理一個(gè)數(shù)據(jù)項(xiàng)之后),這樣Qt可以把事件傳送給窗口部件并且一旦它完成這個(gè)工作就停止這個(gè)定時(shí)器。這是在圖形用戶(hù)界面應(yīng)用程序中實(shí)現(xiàn)繁重的工作的一個(gè)典型方法,現(xiàn)在多線(xiàn)程可以在越來(lái)越多的平臺(tái)上使用,并且我們希望無(wú)效事件最終被線(xiàn)程替代。

            注意QTimer的精確度依賴(lài)于底下的操作系統(tǒng)和硬件。絕大多數(shù)平臺(tái)支持20毫秒的精確度,一些平臺(tái)可以提供更高的。如果Qt不能傳送定時(shí)器觸發(fā)所要求的數(shù)量,它將會(huì)默默地拋棄一些。

            另一個(gè)使用QTimer的方法是為你的對(duì)象調(diào)用QObject::startTimer()和在你的類(lèi)中(當(dāng)然必須繼承QObject)重新實(shí)現(xiàn)QObject::timerEvent()事件處理器。缺點(diǎn)是timerEvent()不支持像單觸發(fā)定時(shí)器或信號(hào)那樣的高級(jí)水平。

            一些操作系統(tǒng)限制可能用到的定時(shí)器的數(shù)量,Qt會(huì)盡力在限制范圍內(nèi)工作。

            posted on 2017-07-23 20:31 zmj 閱讀(1344) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            九九久久99综合一区二区| 亚洲综合熟女久久久30p| …久久精品99久久香蕉国产| 青青草原1769久久免费播放| 久久国产香蕉一区精品| 亚洲国产高清精品线久久| 欧美久久综合性欧美| 精品久久久久中文字幕一区| 精品久久久久久亚洲精品| 亚洲精品99久久久久中文字幕| 亚洲伊人久久成综合人影院| 久久人人爽人人人人爽AV| 亚洲精品无码专区久久久| 精品久久久久中文字幕一区| 亚洲午夜久久久久久久久电影网| 久久国产精品成人免费| 亚洲国产精品无码久久久不卡| 国产三级观看久久| 97久久超碰成人精品网站| 免费一级做a爰片久久毛片潮| 久久久久国色AV免费看图片| 99久久精品免费看国产一区二区三区 | 97热久久免费频精品99| 久久99久久无码毛片一区二区| 久久天天躁狠狠躁夜夜躁2O2O| 狠狠精品久久久无码中文字幕| 国产精品九九久久免费视频| 久久国产色AV免费看| 国产精品一久久香蕉国产线看| 日产久久强奸免费的看| 伊人久久精品影院| 99久久99久久精品国产片果冻| 精品国产热久久久福利| 精品蜜臀久久久久99网站| 午夜精品久久久久久毛片| 久久久久久久精品妇女99| 亚洲欧洲久久久精品| 久久这里只精品99re66| 国产成人精品久久| 国内精品综合久久久40p| 精品久久久久久99人妻|