[QT]制作软件级屏保
生活随笔
收集整理的這篇文章主要介紹了
[QT]制作软件级屏保
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
之前接手的項(xiàng)目中有一個(gè)關(guān)于屏保的需求是,如果超過(guò)30s未進(jìn)行操作,軟件自動(dòng)進(jìn)入屏保狀態(tài)。簡(jiǎn)單分析一下:所謂未進(jìn)行操作即是指未接收到鍵盤(pán)或者鼠標(biāo)事件,超過(guò)30s也就是需要用到定時(shí)器,屏保狀態(tài)就是顯示一張全屏大圖。從QT的角度思考,我們需要?jiǎng)?chuàng)建一個(gè)屏保類(lèi)并且將其做為應(yīng)用程序的一個(gè)事件代理,如果其中有鼠標(biāo)或者鍵盤(pán)事件,則重新刷新定時(shí)器,如果超過(guò)30s沒(méi)有接收到相關(guān)事件則全屏顯示屏保窗口。以下就著代碼實(shí)例講解一下。
構(gòu)造一個(gè)屏保類(lèi)CScreenSaver:
cscreensaver.h文件
#ifndef CSCREENSAVER #define CSCREENSAVER#ifndef QOBJECT_H #include <QObject> #endifclass QTimer; class QLabel; class CScreenSaver : public QObject {Q_OBJECTpublic:CScreenSaver(QObject *parent = NULL);~CScreenSaver();protected slots:void slot_timeout();protected://初始化屏保參數(shù)void init();//事件接收處理函數(shù),由installEventFilter調(diào)用方在接收到事件時(shí)調(diào)用bool eventFilter(QObject *watched, QEvent *event);private://定時(shí)器QTimer *timer;//用于顯示屏保圖片的對(duì)象QLabel *label;//初始屏保等待超時(shí)時(shí)間static const unsigned WAIT_TIME = 30000; };#endif cscreensaver.cpp文件
#include <cscreensaver.h>#include <QFile> #include <QLabel> #include <QEvent> #include <QTimer> #include <QPixmap> #include <QSettings>CScreenSaver::CScreenSaver(QObject *parent): QObject(parent), waitInterval(WAIT_TIME) {init(); }CScreenSaver::~CScreenSaver() { }void CScreenSaver::init() {unsigned waitInterval;QString urlPath;//讀取屏保配置QSettings settings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);settings.beginGroup("SCREENSAVER");if (settings.contains("Interval")){bool ok;waitInterval = settings.value("Interval").toUInt(&ok);if (!ok)waitInterval = WAIT_TIME;}if (settings.contains("PicPath")){urlPath = settings.value("PicPath").toString();}settings.endGroup();//設(shè)置并啟動(dòng)timer。如果超過(guò)30s,則一直顯示屏保并不再觸發(fā)直到再次刷新定時(shí)器timer = new QTimer;timer->setSingleShot(true);connect(timer, SIGNAL(timeout()), this, SLOT(slot_timeout()));timer->start(waitInterval);//屏保窗口QRect screenRect = QApplication::?desktop()->screenGeometry(0);label = new QLabel();label->setGeometry(screenRect);label->setWindowFlags(Qt::FramelessWindowHint);//拉伸背景圖片label->setScaledContents(true);QPixmap pmp;pmp.load(urlPath);label->setPixmap(pmp);label->hide(); }bool CScreenSaver::eventFilter(QObject *obj, QEvent *event) {//判斷事件類(lèi)型if (event->type() == QEvent::KeyPress || event->type() == QEvent::MouseMove|| event->type() == QEvent::MouseButtonPress) {//有鼠標(biāo)或鍵盤(pán)事件則重置timertimer->start();label->hide();}return QObject::eventFilter(obj, event); }void CScreenSaver::slot_timeout() {//顯示屏保label->activateWindow();label->show(); }
main.cpp文件中
#include <QApplication>... #include <cscreensaver.h>int main(int argc, char *argv[]) {QApplication app(argc, argv);...CScreenSaver screenSaver;//全局接收并委托處理事件app.installEventFilter(&screenSaver);...return app.exec(); }
歡迎訪(fǎng)問(wèn)cuzn小站
總結(jié)
以上是生活随笔為你收集整理的[QT]制作软件级屏保的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汇编计算机钢琴流程图,键盘钢琴汇编语言课
- 下一篇: 编写高质量代码改善C++程序的150个建