linux qt qpa linuxfb,Qt 5.4带有Tslib的Linux触摸屏输入在Raspberry Pi上无法使用LinuxFB QPA平台插件...

我为我的Raspberry Pi买了一台Tontec 2.4英寸触摸屏(http://elinux.org/MZTX-PI-EXT) . 触摸屏控制器需要elinux帖子中描述的"tsc2007.ko"和"tsp_raspi.ko"内核模块 . tsc2007.ko模块位于Raspbian内核树中,但可以在此处找到tsp_raspi.ko:https://github.com/osandov/raspi/tree/master/tsc2007 .

我已经为这些模块交叉编译了一个新的内核,并且它们加载正常并在Raspbian中创建/ dev / input / event0设备 . 如果我''测试'那个设备并触摸屏幕,我得到输出,所以我知道事件是在Linux中提供的:

pi@raspberry /dev/input $ evtest

Available devices:

/dev/input/event0: TSC2007 Touchscreen

Select the device event number [0-0]: 0

Input driver version is 1.0.1

Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0

Input device name: "TSC2007 Touchscreen"

Supported events:

Event type 0 (EV_SYN)

Event type 1 (EV_KEY)

Event code 330 (BTN_TOUCH)

Event type 3 (EV_ABS)

Event code 0 (ABS_X)

Value 1922

Min 0

Max 4095

Fuzz 64

Event code 1 (ABS_Y)

Value 2221

Min 0

Max 4095

Fuzz 64

Event code 24 (ABS_PRESSURE)

Value 0

Min 0

Max 4095

Fuzz 64

Properties:

Testing ... (interrupt to exit)

Event: time 1425521704.199489, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1

Event: time 1425521704.199489, type 3 (EV_ABS), code 1 (ABS_Y), value 2085

Event: time 1425521704.199489, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 538

Event: time 1425521704.199489, -------------- SYN_REPORT ------------

Event: time 1425521704.209174, type 3 (EV_ABS), code 0 (ABS_X), value 1455

...

我安装了tslib并运行了一个快速的ts_calibrate . 当我触摸屏幕时,我还确保ts_test吐出数据 .

我在Qt5中为/ etc / profile添加了以下环境变量以获取tslib支持:

## For Qt5 Touchscreen Support

export QT_DEBUG_PLUGINS=1

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/arm-linux-gnueabihf/

export QT_PLUGIN_PATH=/usr/lib/plugins

export QT_QPA_FONTDIR=/usr/lib/fonts

export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins/platforms

export QT_QPA_PLATFORM=linuxfb

export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0

export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0

export TSLIB_TSEVENTTYPE='INPUT'

export TSLIB_CALIBFILE='/etc/pointercal'

export TSLIB_CONFFILE='/etc/ts.conf'

export TSLIB_CONSOLEDEVICE='none'

export TSLIB_FBDEVICE='/dev/fb0'

export TSLIB_PLUGINDIR='/usr/lib/ts'

export TSLIB_TSDEVICE='/dev/input/event0'

我阅读了Qt5文档以及如何在我的应用程序中获取触摸事件 . 我有一个主Widget并在构造函数中设置适当的标志:

MainWidget::MainWidget(QLabel *parent)

: QLabel(parent)

{

qDebug() << "Setting WA_AcceptTouchEvents on MainWidget...";

// Accept touch events

setAttribute(Qt::WA_AcceptTouchEvents);

setAttribute(Qt::WA_StaticContents);

}

我设置了一个事件过滤器来尝试捕获触摸事件:

bool MainWidget::eventFilter( QObject* target, QEvent* e )

{

qDebug() << "Event Type: " << e->type();

return false;

return QLabel::eventFilter(target, e);

}

我像这样启动我的应用程序:

myapp -platform linuxfb:fb = / dev / fb0 -plugin tslib:/ dev / input / event0

我还在Qt的qtslib.cpp源代码中取消注释了一个printf:

void QTsLibMouseHandler::readMouseData()

{

ts_sample sample;

while (get_sample(m_dev, &sample, m_rawMode)) {

bool pressed = sample.pressure;

int x = sample.x;

int y = sample.y;

// work around missing coordinates on mouse release

if (sample.pressure == 0 && sample.x == 0 && sample.y == 0) {

x = m_x;

y = m_y;

}

if (!m_rawMode) {

//filtering: ignore movements of 2 pixels or less

int dx = x - m_x;

int dy = y - m_y;

if (dx*dx <= 4 && dy*dy <= 4 && pressed == m_pressed)

continue;

}

QPoint pos(x, y);

//printf("handleMouseEvent %d %d %d %ld\n", m_x, m_y, pressed, sample.tv.tv_usec);

QWindowSystemInterface::handleMouseEvent(0, pos, pos, pressed ? Qt::LeftButton : Qt::NoButton);

m_x = x;

m_y = y;

m_pressed = pressed;

}

}

当我启动我的Qt应用程序时,我看到插件正在加载正常(甚至显示正确的event0文件) . 我还看到qt tslib插件在我触摸屏幕时正在接收触摸事件 . 问题是事件过滤器永远不会被调用!

这是推出的应用程序:

Got keys from plugin meta data ("tslib", "tslibraw")

QFactoryLoader::QFactoryLoader() checking directory path "/home/pi/generic" ...

loaded library "/usr/lib/qt/plugins/generic/libqtslibplugin.so"

QTsLibMouseHandler "tslib" ""

QTsLibMouseHandler "tslib" "/dev/input/event0"

QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/qt/plugins/styles" ...

QFactoryLoader::QFactoryLoader() checking directory path "/home/pi/styles" ...

Setting WA_AcceptTouchEvents on MainWidget...

-----------------------------------------

Waiting for data now...

-----------------------------------------

handleMouseEvent 0 0 1 751196

handleMouseEvent 0 0 1 751196

handleMouseEvent 1696 1615 1 771075

handleMouseEvent 1696 1615 1 771075

handleMouseEvent 1679 1622 1 781368

handleMouseEvent 1671 1638 1 781368

handleMouseEvent 1679 1622 1 781368

handleMouseEvent 1671 1638 1 781368

...

我发现了一些论坛帖子,人们在使用linuxfb平台插件时遇到触摸输入问题:

我已经尝试了所有他们的建议并且仍然有问题 - 我的应用程序没有收到任何触摸事件,即使Qt tslib插件说它正在接收它们 .

似乎tslib插件在将接收到的事件注入我的应用程序的事件循环时出现问题:

QWindowSystemInterface::handleMouseEvent(0, pos, pos, pressed ? Qt::LeftButton : Qt::NoButton);

我也尝试了Qt5.4触摸指纹示例并看到了相同的行为 - 没有收到任何触摸事件 .

我不知道从哪里开始 . 我非常感谢任何帮助解决这个问题 . 谢谢!

更新:

我更改了我的事件过滤器,所以它看起来像这样:

bool MainWidget::eventFilter(QObject *obj, QEvent *event)

{

qDebug() << "Event received" << obj->metaObject()->className() << event->type();

switch (event->type()) {

case QEvent::TouchBegin:

qDebug() << "TouchBegin";

case QEvent::TouchUpdate:

qDebug() << "TouchUpdate";

case QEvent::TouchEnd:

qDebug() << "TouchEnd";

{

// QTouchEvent *touch = static_cast(event);

// QList<:touchpoint> touchPoints = static_cast(event)->touchPoints();

// foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints) {

// switch (touchPoint.state()) {

// case Qt::TouchPointStationary:

// // don't do anything if this touch point hasn't moved

// continue;

// default:

// {

// }

// break;

// }

// }

// break;

}

//default:

//return QLabel::event(event);

}

//return true;

}

现在,每当我触摸屏幕时,我都会看到'socket notifier'事件与Qt Tslib Plugin的打印混合在一起 . 关于为什么事件类型50但没有触摸事件的任何想法?

Event received QSocketNotifier 50

handleMouseEvent 2702 2618 0 557715

Event received QSocketNotifier 50

handleMouseEvent 2698 2612 1 547758

Event received QSocketNotifier 50

handleMouseEvent 2706 2802 1 759928

Event received QSocketNotifier 50

Event received QSocketNotifier 50

更新#2:

我安装了事件过滤器只是为了尝试捕获任何事件 . 我在Qt5中不确定将事件类型50(QSocketNotifier)转换为QTouch *或QMouse *事件 .

以下是一些更多信息:

当我运行evtest时,我看到屏幕分辨率很大(~2500 x~2500),实际屏幕是320x240 . 我尝试将/boot/config.txt中的/ dev / fb0帧缓冲区大小更改为320x240并重新启动 . 但evtest和ts_calibrate步骤仍显示出巨大的分辨率 .

由于分辨率很高,我尝试制作我的主要小部件10000x10000以查看我是否会获得触摸或鼠标事件 - 但我仍然只获得QSocketNotifier

然后我试图强制tslib插件总是在屏幕位置X = 50 Y = 50处注入事件,但我仍然只得到事件类型50 QSocketNotifier .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值