通过重载ScreenSaver类的restore和save方法可以实现QTE环境下的屏保功能。
screensaver.cpp文件
#include <sys/io.h>
#include <qwindowsystem_qws.h>
#include "screensaver.h"
void ScreenSaver::setInterval(int ms)
{
QWSServer::setScreenSaverInterval(ms);
}
void ScreenSaver::backlight_on()
{
int ret=iopl(3);
if(ret){
printf("%d:iopl error!\n",__LINE__);
return;
}
outb_p(0xaa,0x2b4); //打开背光,跟硬件连接有关
}
void ScreenSaver::backlight_off()
{
int ret=iopl(3);
if(ret){
printf("%d:iopl error!\n",__LINE__);
return;
}
outb_p(0x55,0x2b4); //关闭背光,跟硬件连接有关
}
ScreenSaver::ScreenSaver()
{
backlight_on();
img = new QImage(":/picture/1.jpg");
QPixmap pixmap = QPixmap::fromImage(*img);
QPalette pal;
QWSServer::setBackground(QBrush(pixmap)); //刚开始显示一张图片,等待背光关闭
}
ScreenSaver::~ScreenSaver()
{
if(img){
delete img;
img = NULL;
}
}
void ScreenSaver::restore()
{
//qDebug()<<"screen restore"<<endl;
backlight_on();
};
bool ScreenSaver::save(int level)
{
//qDebug()<<"screen save"<<endl;
backlight_off();
return true;
}
screensaver.h文件
#ifndef SCREENSAVER_H
#define SCREENSAVER_H
#include <qwindowsystem_qws.h>
#include <QImage>
#include <QPixmap>
#include <QPalette>
class ScreenSaver:public QWSScreenSaver
{
public:
ScreenSaver();
~ScreenSaver();
void restore();
bool save(int level);
void setInterval(int ms);
private:
void backlight_on();
void backlight_off();
QImage* img;
};
#endif // SCREENSAVER_H
然后在main.cpp中调用即可
#include <QApplication>
#include "screensaver.h"
#include <sys/io.h>
#include <qwindowsystem_qws.h>
int main(int argc,char* argv[])
{
QApplication a(argc,argv);
ScreenSaver* saver = new ScreenSaver;
saver->setInterval(60000); //60 s
QWSServer::setScreenSaver(saver);
return a.exec();
}