Qt實現屏保功能,滑鼠一定時間無響應程式進入待機狀態

來源:互聯網
上載者:User

最近使用Qt實作類別似與屏保的功能,當滑鼠在一定時間內一直停留在一個位置的時候,程式會自動切入到其他介面(用於顯示一些資訊),當滑鼠移動的時候,螢幕切換回來,效果類似於螢幕保護裝置。

實現想法如下:

想法一:

繼承QApplication類,重寫

函數,擷取QEvent,如果是滑鼠移動事件,就將定時器停止,否則就啟動定時器,當定時器到達一定時間的時候,觸發槽事件,切換畫面。

在啟動定時器的時候要注意,首先要判斷定時器是否已經啟動了,如果已經啟動了,就不要重複啟動了。

還需要定義一個函數

在main.cpp裡面將定義的表單傳進來,這樣就能對表單進行操作了,並且可以綁定訊號和槽了,在這裡我的槽函數是在表單的cpp裡面實現的。

代碼如下:

main.cpp

#include <QtGui/QApplication>#include "fullscreenwindow.h"#include "application.h"int main(int argc, char *argv[]){    Application a(argc, argv);    FullScreenWindow w;    a.setWindowInstance(&w);    w.show();    return a.exec();}
application.h

#ifndef APPLICATION_H#define APPLICATION_H#include <QApplication>#include <QDebug>#include "fullscreenwindow.h"#include "qtimer.h"class Application : public QApplication{public:    Application(int & argc, char ** argv);    bool notify(QObject *, QEvent *);    void setWindowInstance(FullScreenWindow* wnd);private:    FullScreenWindow* window; //儲存一個你表單的指標    QTimer *timer;};#endif // APPLICATION_H

application.cpp

#include "application.h"Application::Application(int &argc, char **argv)    :  QApplication(argc,argv)    ,  window(0){    //建立一個QTimer對象    timer = new QTimer();    //設定定時器每個多少毫秒發送一個timeout()訊號    timer->setInterval(10000);    //啟動定時器    timer->start();}void Application::setWindowInstance(FullScreenWindow *wnd){    window = wnd;    //訊號和槽    connect(timer, SIGNAL(timeout()), wnd,SLOT(onTimerOut()));}bool Application::notify(QObject *obj, QEvent *e){    if(e->type() == QEvent::MouseMove)    {        if(window)        {            timer->stop();            qDebug()<<"stop";            window->resize(500,500); //調用你表單相應的函數        }    }    else    {        if(!timer->isActive())        {            timer->start();            qDebug()<<"start";        }    }    return QApplication::notify(obj,e);}

fullscreenwindow.h

#ifndef FULLSCREENWINDOW_H#define FULLSCREENWINDOW_H#include <QMainWindow>namespace Ui {    class FullScreenWindow;}class FullScreenWindow : public QMainWindow{    Q_OBJECTpublic:    explicit FullScreenWindow(QWidget *parent = 0);    ~FullScreenWindow();private:    Ui::FullScreenWindow *ui;private slots:    void onTimerOut();};#endif // FULLSCREENWINDOW_H

fullscreenwindow.cpp

#include "fullscreenwindow.h"#include "ui_fullscreenwindow.h"FullScreenWindow::FullScreenWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::FullScreenWindow){    ui->setupUi(this);}FullScreenWindow::~FullScreenWindow(){    delete ui;}void FullScreenWindow::onTimerOut(){    this->resize(900,900);}

實現的效果是:介面開始的時候表單大小400*300,滑鼠移動的話就變成了500*500,如果滑鼠10s不動,表單大小變成900*900,當然,你也可以在onTimeOut函數中實現表單的切換操作,那就是屏保效果啦。

下載程式

想法二:

使用定時器(1s)和計數器,表單聲明的時候擷取當前滑鼠位置(x,y),當定時器時間到的時候再次擷取滑鼠位置(x1,y1),如果滑鼠位置改變,那就說明這1s內滑鼠移動了,計數器清零,如果滑鼠位置不變,那計數器就+1,直到計數器到達一定數量,表示滑鼠這段時間沒有移動,那就進入切換介面操作,當然,這種做法不是十分科學,有可能在1s之內滑鼠動了又移回到之前的位置(一個像素也不差),這種情況沒法判斷的,但是這種情況手工發生幾率不大。


總結:

想法一實現的過程中遇到以下問題:當滑鼠不在當前介面上時,或者介面最小化時,程式會當成滑鼠未移動,也就是說此時你移動滑鼠,到達時間時,也會進入屏保程式,所以Application裡面擷取的QEvent中的MouseMove指的是在程式介面上的滑鼠移動。目前這個問題還是沒有解決,期待大神解答。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.