起初由于时间关系,测试
export QWS_KEYBOARD=Linuxinput:/dev/input/event1,
出现console控制台被屏蔽,没有任何串口信息,个人感觉数据可能输入到屏幕framebuffer中,导致触摸屏操作很卡。然后选择
export QWS_KEYBOARD=TTY:/dev/input/event1,
接收到大量的错误数据,查看QT库,QT默认选择的是tty接收键盘信息,但是设备文件不是库函数中/dev/tty0,造成读取错误。通过linux下标准input,接收响应事件struct input_event,读取键值,通过槽函数建立监听实现按键功能。
后来项目测试阶段,通过监听响应槽函数(执行操作很多),造成按键响应比较慢,不满足用户需求。阅读库函数代码,发现LinuxInput不处理VT(参见linux/vt.h),这就是为什么串口控制台没有数据显示,造成数据阻塞的原因,因而参考LinuxInput方式修改kbdtty_qws,实现了标准的按键控制。
修改程序中关于按键响应的部分,发现子窗口弹出后无法响应按键消息,通过打印信息,发现keyPressEvent函数没有执行,但是执行了标准的按键响应,证明按键事件被继承的父类grab,因为不能响应继承子类改写的按键事件,目前采用this->grabKeyboard();获得按键消息,然后在Ui销毁后释放this->releaseKeyboard();不知道是否还有别的方式,先写到这了。
/src/gui/embedded/qkbdtty_qws.cpp
#if defined Q_OS_LINUX
# include <linux/kd.h>
+# include <linux/input.h>
# include <linux/vt.h> //TODO: move vt handling somewhere else (QLinuxFbScreen?)
# include "qscreen_qws.h"
-bool QWSTtyKeyboardHandler::filterKeycode(char &)
+
+bool QWSTtyKeyboardHandler::filterInputEvent(quint16 &, qint32 &)
{
return false;
}
void QWSTtyKbPrivate::readKeycode()
{
- char buffer[32];
+ struct ::input_event buffer[32];
int n = 0;
forever {
- n = QT_READ(m_tty_fd, buffer + n, 32 - n);
+ n = QT_READ(m_tty_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
if (n == 0) {
qWarning("Got EOF from the input device.");
} else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
qWarning("Could not read from input device: %s", strerror(errno));
return;
- } else {
+ } else if (n % sizeof(buffer[0]) == 0) {
break;
}
}
+ n /= sizeof(buffer[0]);
+
for (int i = 0; i < n; ++i) {
- if (m_handler->filterKeycode(buffer[i]))
+ if (buffer[i].type != EV_KEY)
+ continue;
+
+ quint16 code = buffer[i].code;
+ qint32 value = buffer[i].value;
+
+ if (m_handler->filterInputEvent(code, value))
continue;
QWSKeyboardHandler::KeycodeAction ka;
- ka = m_handler->processKeycode(buffer[i] & 0x7f, (buffer[i] & 0x80) == 0x00, buffer[i] == m_last_keycode);
- m_last_keycode = buffer[i];
+ ka = m_handler->processKeycode(code, value != 0, value == 2);
switch (ka) {
case QWSKeyboardHandler::CapsLockOn:
####################################################################################
/src/gui/embedded/qkbdtty_qws.h
explicit QWSTtyKeyboardHandler(const QString&);
virtual ~QWSTtyKeyboardHandler();
- virtual bool filterKeycode(char &code);
+ virtual bool filterInputEvent(quint16 &, qint32 &);
private:
QWSTtyKbPrivate *d;