最近使用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指的是在程式介面上的滑鼠移動。目前這個問題還是沒有解決,期待大神解答。