Qt4.8.6 arm 平台
根据qt-everywhere-opensource-src-4.8.6/examples/qws/mousecalibration 示例修改
calibration.h
#ifndef CALIBRATION_H
#define CALIBRATION_H
#include <QDialog>
#include <QWSPointerCalibrationData>
//! [0]
class Calibration : public QDialog
{
public:
Calibration();
~Calibration();
int exec();
protected:
void paintEvent(QPaintEvent*);
void mouseReleaseEvent(QMouseEvent*);
void accept();
private:
QWSPointerCalibrationData data;
int pressCount;
};
//! [0]
#endif
calibration.cpp
#include "calibration.h"
#include <QDebug>
#include <QLabel>
#include <QWSPointerCalibrationData>
#include <QPainter>
#include <QFile>
#include <QTimer>
#include <QApplication>
#include <QDesktopWidget>
#include <QMouseEvent>
#include <QScreen>
#include <QWSServer>
Calibration::Calibration()
{
QRect desktop = QApplication::desktop()->geometry();
desktop.moveTo(QPoint(0, 0));
setGeometry(desktop);
setFocusPolicy(Qt::StrongFocus);
setFocus();
setModal(true);
int width = qt_screen->deviceWidth();
int height = qt_screen->deviceHeight();
int dlx = width/2;
int dly = height/2;
QLabel *label = new QLabel(this);
label->setText("请点击十字叉校准触摸屏");
QFont ft;
ft.setPointSize(30);
label->setFont(ft);
QPalette pe;
pe.setColor(QPalette::WindowText, Qt::white);
label->setPalette(pe);
label->adjustSize();
label->size().width();
label->move((width - label->size().width())/2, (height / 4));
int dx = width / 10;
int dy = height / 10;
QPoint *points = data.screenPoints;
points[QWSPointerCalibrationData::TopLeft] = QPoint(dx, dy);
points[QWSPointerCalibrationData::BottomLeft] = QPoint(dx, height - dy);
points[QWSPointerCalibrationData::BottomRight] = QPoint(width - dx, height - dy);
points[QWSPointerCalibrationData::TopRight] = QPoint(width - dx, dy);
points[QWSPointerCalibrationData::Center] = QPoint(width / 2, height / 2);
pressCount = 0;
}
Calibration::~Calibration()
{
}
int Calibration::exec()
{
QWSServer::mouseHandler()->clearCalibration();
grabMouse();
activateWindow();
int ret = QDialog::exec();
releaseMouse();
return ret;
}
void Calibration::paintEvent(QPaintEvent*)
{//画十字+
QPainter p(this);
p.fillRect(rect(), Qt::black);
QPoint point = data.screenPoints[pressCount];
// Map to logical coordinates in case the screen is transformed
QSize screenSize(qt_screen->deviceWidth(), qt_screen->deviceHeight());
point = qt_screen->mapFromDevice(point, screenSize);
#if 0
//十字 横线
p.fillRect(point.x() - 6, point.y() - 1, 13, 3, Qt::red);
//十字 竖线
p.fillRect(point.x() - 1, point.y() - 6, 3, 13, Qt::red);
#else
//设置pWigth 和 pPreWigth调节 十字叉大小 , pWigth 必须比 pPreWigth大
//pPreWigth 十字外部直角边长度
//pWigth (十字宽度-1)/2
int pPreWigth = 5;
int pWigth = 21;
p.fillRect(point.x() - (pWigth-1), point.y() - (pWigth-1), pPreWigth, 1, Qt::white);
p.fillRect(point.x() + (pWigth-pPreWigth) , point.y() - (pWigth-1), pPreWigth, 1, Qt::white);
p.fillRect(point.x() - pWigth, point.y() - 1, pWigth*2+1, 3, Qt::white);
p.fillRect(point.x() - (pWigth-1), point.y() + (pWigth-1), pPreWigth, 1, Qt::white);
p.fillRect(point.x() + (pWigth-pPreWigth) , point.y() + (pWigth-1), pPreWigth, 1, Qt::white);
p.fillRect(point.x() - (pWigth-1), point.y() - (pWigth-1), 1, pPreWigth, Qt::white);
p.fillRect(point.x() - (pWigth-1), point.y() + (pWigth-pPreWigth), 1, pPreWigth, Qt::white);
p.fillRect(point.x() - 1, point.y() - pWigth, 3, pWigth*2+1, Qt::white);
p.fillRect(point.x() + (pWigth-1), point.y() - (pWigth-1), 1, pPreWigth, Qt::white);
p.fillRect(point.x() + (pWigth-1), point.y() + (pWigth-pPreWigth), 1, pPreWigth, Qt::white);
#endif
}
void Calibration::mouseReleaseEvent(QMouseEvent *event)
{
// Map from device coordinates in case the screen is transformed
QSize screenSize(qt_screen->width(), qt_screen->height());
QPoint p = qt_screen->mapToDevice(event->pos(), screenSize);
data.devPoints[pressCount] = p;
if (++pressCount < 5)
repaint();
else
accept();
}
void Calibration::accept()
{
Q_ASSERT(pressCount == 5);
QWSServer::mouseHandler()->calibrate(&data);
QDialog::accept();
}
调用方法:
void execCalibration()
{
qDebug()<<"Calibration start ...";
Calibration cal;
cal.exec();
qDebug()<<"Calibration end ...";
//数据保存到qt_pointercal中
QMessageBox::StandardButton rb = QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if(rb == QMessageBox::Yes)
{
qDebug()<<"save to pointeral";
QFile rfile("/opt/qt_pointercal");
if(rfile.open(QIODevice::ReadOnly))
{
QString data;
char buff[512];
rfile.readLine(buff, 512);
data=buff;
qDebug()<<data;
QFile wfile("/opt/pointercal");
wfile.open(QIODevice::WriteOnly);
wfile.write(data.toLatin1(), data.length());
wfile.close();
rfile.close();
}
}
}
注意:qt程序启动时根据tslib的环境变量TSLIB_CALIBFILE 指定的文件加载校准文件,
而上面实现的qt会保存校准数据到POINTERCAL_FILE指定的文件中,校验完以后要把
POINTERCAL_FILE指定的文件内容拷贝到TSLIB_CALIBFILE 中
POINTERCAL_FILE=/opt/qt_pointercal
TSLIB_CALIBFILE=/opt/pointercal