Qt实现触摸屏校准界面

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


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值