最近发现一个问题,当我在嵌入式设备中使用环境变量QWS_KEYBOARD的时候,运行Qt程序,程序会被挂起。串口终端那边无法再输入任何东西。上网查找原因,发现也有其他的人碰到过这个问题,他们大多数的解决办法就是使用QWS_USB_KEYBOARD,但是由于我使用的是i2c的键盘设备,而不是usb的,所以这种方法对我没什么用。最后看到一篇老外的帖子,他提到需要修改Qt的源代码。
下面是修改部分:
修改.../src/gui/embedded/qkbdlinuxinput_qws.cpp
#if 0
if (m_tty_fd >= 0) {
// save tty config for restore.
tcgetattr(m_tty_fd, &m_tty_attr);
struct ::termios termdata;
tcgetattr(m_tty_fd, &termdata);
// record the original mode so we can restore it again in the destructor.
::ioctl(m_tty_fd, KDGKBMODE, &m_orig_kbmode);
// setting this translation mode is even needed in INPUT mode to prevent
// the shell from also interpreting codes, if the process has a tty
// attached: e.g. Ctrl+C wouldn't copy, but kill the application.
::ioctl(m_tty_fd, KDSKBMODE, K_MEDIUMRAW);
// set the tty layer to pass-through
termdata.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
termdata.c_oflag = 0;
termdata.c_cflag = CREAD | CS8;
termdata.c_lflag = 0;
termdata.c_cc[VTIME]=0;
termdata.c_cc[VMIN]=1;
cfsetispeed(&termdata, 9600);
cfsetospeed(&termdata, 9600);
tcsetattr(m_tty_fd, TCSANOW, &termdata);
}
#endif
将这段代码注释掉,重新编译替换原来的libQtGui.so.4文件即可
完成之后export QWS_KEYBOARD="LinuxInput:/dev/input/event1" 就可以正确使用键盘了