Qt 下触摸屏的驱动
Qt/Embedded 中与用户输入事件相关的信号,是 建立在对底层输入设备的接口调用之上的,一般通过 对设备文件的 I/O 读写来实现。大部分这样的驱动程序已经被封装进 Qt 库当中,形成了相应的设备驱动接口,如显示卡驱动、鼠标、键盘、串口和并口等。 其中鼠标设备的抽象基类为 QWSMouse Handler,从 该类又重新派生出一些具体的鼠标类设备的实现类。在 3.3.4 版本系列的 Qt/Embedded 中,鼠标类设备的派生结构如图 3 所示。
图 3 鼠标类设备的派生结构图(灰色线框表示可省略类结构)
鼠标类设备的加载方式与 KeyBoard 设备加载方 式是类似的,在系统构造 QWSServer 对象时,调用成 员函数 QWSServer:: openMouse,程序在QWSServer:: openMouse 函数中再调用QmouseDriverFactory::create () 或QmouseDriverPlugin:: create ()。该函数根据 Linux 系统的环境变量QWS_MOUSE_PROTO获得鼠标类设备的设备类型和设备节点。打开并返回相应设备的基类指针 QWSMouseHandler 给系统,系统通过操作该基类派生出的具体子类设备指针QWSCustomMouseHandler,获得对具体鼠标类设备的调用操作(见图 4)。
图 4 软件流程图
触摸屏和鼠标类设备在功能上基本是一致的,因 此,在 Qt 库中一般把触摸屏模拟成鼠标设备来实现 对触摸屏设备的操作。
基于Qt的触摸屏校准程序
/****************************************************************************
****************************************************************************/
#ifndef CALIBRATION_H
#define CALIBRATION_H
#include <QDialog>
#include <QWSPointerCalibrationData>
//! [0]
class Calibration : public QDialog
{
// Q_OBJECT
public:
Calibration();
~Calibration();
int exec();
void init();
void calibration_quit();
protected:
void paintEvent(QPaintEvent*);
void mouseReleaseEvent(QMouseEvent*);
void accept();
private:
QWSPointerCalibrationData data;
int pressCount;
QWSPointerCalibrationData data_read;
};
//! [0]
#endif
/****************************************************************************
****************************************************************************/
#include "calibration.h"
#include <QWSPointerCalibrationData>
#include <QPainter>
#include <QFile>
#include <QTimer>
#include <QApplication>
#include <QDesktopWidget>
#include <QMouseEvent>
#include <QScreen>
#include <QWSServer>
#include <QDebug>
#include <QMessageBox>
#include <QWSCalibratedMouseHandler>
#include <QtGui>
#include "Qtglobal.h"
//! [0]
static QWSPointerCalibrationData initial_data;
static bool flag=false;
Calibration::Calibration()
{
}
//! [2]
void Calibration::init() //触摸屏的坐标信息等初始化, 使鼠标焦点校准窗口上,
{
this->setCursor(QCursor(Qt::BlankCursor));
QRect desktop = QApplication::desktop()->geometry();
desktop.moveTo(QPoint(0, 0));
setGeometry(desktop);
setFocusPolicy(Qt::StrongFocus);
setFocus();
setModal(true);
//! [0]
//! [1]
int width = qt_screen->deviceWidth();
int height = qt_screen->deviceHeight();
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);
//! [1]
//! [2]
pressCount = 0; //屏幕校准点计数
}
//! [3]
Calibration::~Calibration()
{
}
//! [3]
//! [4]
int Calibration::