找回密码
 立即注册
收起左侧

关于qt程序中使用屏保的问题

1
回复
5577
查看
[复制链接]
累计签到:14 天
连续签到:1 天
来源: 2015-8-20 10:59:06 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
以下是网上的一个例程:
在使用过程中有一个问题 在屏保界面存在时 怎样让定时器处于一直stop状态
以下的程序我在LinuxQT中经过修改跑起来后 在定时器槽函数中创建屏保界面后 如果鼠标事件不触发 定时器一直工作中就会每个10s 创建一次 请问怎样在程序中进行修改 屏保只出现一次





Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态
最近使用Qt实现类似与屏保的功能,当鼠标在一定时间内一直停留在一个位置的时候,程序会自动切入到其他界面(用于显示一些信息),当鼠标移动的时候,屏幕切换回来,效果类似于屏幕保护。
实现想法如下:
想法一:
继承QApplication类,重写

bool Application::notify(QObject *obj, QEvent *e)函数,获取QEvent,如果是鼠标移动事件,就将定时器停止,否则就启动定时器,当定时器到达一定时间的时候,触发槽事件,切换屏幕。
在启动定时器的时候要注意,首先要判断定时器是否已经启动了,如果已经启动了,就不要重复启动了。
还需要定义一个函数

void Application::setWindowInstance(FullScreenWindow *wnd)在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:nTimerOut(){    this->resize(900,900);}
实现的效果是:界面开始的时候窗体大小400*300,鼠标移动的话就变成了500*500,如果鼠标10s不动,窗体大小变成900*900,当然,你也可以在onTimeOut函数中实现窗体的切换操作,那就是屏保效果啦。



回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2015-9-2 14:52:35 显示全部楼层
没人回答的吗 给点建议也好呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了