- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我为我的 Raspberry Pi 买了一个 Tontec 2.4 英寸触摸屏 ( http://elinux.org/MZTX-PI-EXT )。触摸屏 Controller 需要“tsc2007.ko”和“tsp_raspi.ko”内核模块,如 elinux 帖子中所述。 tsc2007.ko 模块位于 Raspbian 内核树中,但可以在此处找到 tsp_raspi.ko:https://github.com/osandov/raspi/tree/master/tsc2007 .
我已经使用这些模块为 Pi 交叉编译了一个新内核,它们可以正常加载并在 Raspbian 中创建一个/dev/input/event0 设备。如果我“evtest”那个设备并触摸屏幕,我会得到输出,所以我知道事件正在 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 在我触摸屏幕时吐出数据。
我在/etc/profile 中添加了以下环境变量以支持 Qt5 中的 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 插件在将它接收到的事件注入(inject)我的应用程序的事件循环时遇到了问题:
QWindowSystemInterface::handleMouseEvent(0, pos, pos, pressed ? Qt::LeftButton : Qt::NoButton);
我还尝试了 Qt5.4 touch fingerpaint 示例并看到相同的行为 - 没有收到触摸事件。
我不确定从这里到哪里去。如果能帮助解决这个问题,我将不胜感激。谢谢!
更新:
我更改了我的事件过滤器,使其看起来像这样:
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<QTouchEvent *>(event);
// QList<QTouchEvent::TouchPoint> touchPoints = static_cast<QTouchEvent *>(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;
}
现在,每当我触摸屏幕时,我都可以看到“套接字通知程序”事件与 Qt Tslib 插件的打印混合在一起。关于为什么事件类型为 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:
我安装事件过滤器只是为了 try catch 任何事件。我不确定在 Qt5 中是什么将事件类型 50 ( QSocketNotifier ) 转换为 QTouch* 或 QMouse* 事件。
这里是一些更多的信息:
最佳答案
通过确保在 RasbperryPi 上安装了 tslib 插件,问题得以解决。
TSLIB_PLUGINDIR=/usr/lib/ts
目录/usr/lib/ts 在 Pi 上不存在。
关于linux - Qt 5.4 Linux 触摸屏输入在 Raspberry Pi 上使用 Tslib 使用 LinuxFB QPA 平台插件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868963/
我这里有这样的 slider :https://jsfiddle.net/args91L4/我如何让它在触摸屏上工作,更准确地说,在 vanilla js 或纯 jquery 上没有第三方插件的方式是
我正在使用 HP 触摸屏台式计算机开发一个简单的网站。我想防止用户同时用八个手指“捣碎”屏幕点击。 jQuery 有没有办法一次只允许注册一个触摸事件?这样,当第一个手指点击屏幕时,即注册了该手指,并
我有一个 Web 应用程序,需要有在自助服务终端样式、仅触摸屏环境中使用的选项。我想知道是否有任何我们可以使用的基于浏览器的好键盘。可能是基于 javascript 或 jquery 的东西。基本上,
我有一个 div,它在桌面浏览器上滚动得很好,但在带有触摸屏的移动设备上,滚动不起作用。 这是一个stripped down jsFiddle带有一些实际代码。滚动在您的移动浏览器中运行良好,但请相信
我有一台装有 Windows 7 的触摸屏电脑,我想禁用多点触控手势: 但即使我禁用它并应用更改,当我重新打开窗口时,该选项也会再次启用... 知道在哪里可以永久禁用它吗? (也许在注册表中...)
在移动设备(触摸屏)上缩放后,Highmap 数据点单击事件中断有什么建议吗? 最佳答案 tooltip.pointFormatter 与 useHTML 结合使用仍然期望一个字符串作为返回值,因此应
我正在用Java(使用Swing)为自动机开发一个基于触摸屏的应用程序,例如this 。由于操作系统会处理所有触摸事件,因此我只需开发一个桌面应用程序并在触摸设备上使用它即可。 如果有人可以帮助我,我
我会尽可能清楚地描述我的问题。我正在尝试让触摸屏设备与 Android 一起工作。该设备是一个 USB 设备,我让它在各种操作系统(Windows、Mac OS X、Ubuntu)中正常工作。在 An
我们有一个在 Win 7 上运行的 WPF 应用程序。在 Win 7 中启用触摸手势,当滚动 ListView 时,应用程序在到达列表末尾时在屏幕上“耸耸肩”。 这也可以在 Internet Expl
我需要在我的 Android 设备上禁用和启用触摸屏。我试过了 adb shell su rm -rf /dev/input/event2 和 adb shell su rm -rf /dev/inp
我有一台运行 Windows 10 的 PiPo x9(触摸屏)。Google Chrome 已加载,可以正确查看网页。通过 CefBrowser 加载的同一页面对鼠标事件做出奇怪的响应。我使用的是
我有一台运行 Windows 10 的 PiPo x9(触摸屏)。Google Chrome 已加载,可以正确查看网页。通过 CefBrowser 加载的同一页面对鼠标事件做出奇怪的响应。我使用的是
希望有人能帮我解决这个问题,为此我苦苦挣扎了一会儿。我需要为触摸设备上的最终用户提供“单击”下拉菜单以显示子菜单项的能力。就桌面体验而言,这显然是一种常见的 UX 构造,但对于移动或触摸设备而言,它并
我在这个网站上有一个菜单,它在标准 Windows 8.1 PC 上的 chrome 上运行正常,但在带有触摸屏的 Windows 8.1 笔记本电脑上的 chrome 上查看时出现奇怪的问题。 子菜
我正在用 Java 开发一个 Swing 应用程序。该程序将在专用的 Windows 7 触摸屏机器上运行,据我所知,在正常操作下,该程序应该是唯一在这些机器上运行的东西。 我注意到 Windows
目前我正在 STM32f4 板上开发 USB 触摸屏 HID 描述符(自定义 HID 描述符)。为此,我为单个联系人标识符(单手指触摸)实现了一个 HID 描述符,它对我有用。但是,我的要求是多点触摸
大家早上好。 我买了一个集成了电阻式触摸屏的液晶嵌入式显示器。TS 可通过 USB 连接。 我已将其连接到运行 Android 4.0.3 的设备,并且触摸被正确识别为外部 HID。问题:点击(按下)
我想知道是否可以在 microsoft Surface 触摸屏(例如 Samsung SUR40 不是 Surface 平板电脑)又名 pixelsense ? 我在互联网上搜索了一整天,但找不到任何
最近我正在开发基于谷歌地图的网站。它适用于大多数设备,但是当我在 MS Surface 触摸屏上安装 Chrome 浏览器后,我无法用手指捏合和缩放谷歌地图。但我可以使用 Chrome 浏览器在map
我是一名优秀的程序员,十分优秀!