Qt之支持usb触摸屏热插拔

环境:周立功的m3352的核心板,使用tslib,Qt4.7的环境下

usb触摸屏断开之后,即使重连,在已经运行的qt程序中,并且系统已经生成了触摸设备节点,qt程序也是不能恢复触摸。

解决方法:修改qt源码中的src/gui/embedded/qmousetslib_qws.cpp

在QWSTslibMouseHandlerPrivate::readMouseData()的开始处加入以下代码

void QWSTslibMouseHandlerPrivate::readMouseData() 
{
    if(!qt_screen)
        return;
    /* Support usb touchscreen hotplug */
    int version;
    if (ioctl(ts_fd(dev), EVIOCGVERSION, &version) < 0) {
        disconnect(mouseNotifier, 0, 0, 0);
        delete mouseNotifier;
        while (1) {
            if(open()) {
                mouseNotifier = new QSocketNotifier(ts_fd(dev), QSocketNotifier::Read, this);
                connect(mouseNotifier, SIGNAL(activated(int)), this, SLOT(readMouseData()));
                resume();
                return;
            }
            system("echo waiting for tp ...");
            system("sleep 1");
        }
    }
    /* end */
    ...
}

注:

  • 记得ioctl()的头文件, #include
  • EVIOCGVERSION未定义 ,#define EVIOCGVERSION _IOR('E', 0x01, int) /* 获取驱动的版本信息*/

重新编译qt,将生成的libQtGui.so.4.7.3替换到机器上即可

这一次真的被搞死了,arm板子是周立功的m3352的核心板,一切都按照他给的参考资料,然后发现,实际里面的跟他们给的教程的build-qt是不一致的,使用新编译的库替换后,永远运行不成功,不是bus error,就是Segmentation fault

替换后的Qt4编译源码的build-qt.sh文件

#!/bin/sh


(echo yes) | \
./configure 							\
        -prefix /opt/qt /*指定路径*/         				\
        -embedded arm                                 		\
        -platform qws/linux-x86-g++     			\
        -xplatform qws/linux-arm-gnueabi-g++      		\
        -depths 16,18,24,32                             	\
        -no-mmx                                                 \
        -no-3dnow                                               \
        -no-sse                                                 \
        -no-sse2                                                \
        -no-glib                                                \
        -no-cups                                                \
        -no-largefile                                  		\
        -no-accessibility                              		\
        -no-openssl                                    		\
        -no-gtkstyle                                   		\
        -qt-mouse-pc                                   		\
        -qt-mouse-linuxtp                              		\
        -qt-mouse-linuxinput                   			\
        -plugin-mouse-linuxtp                   		\
        -plugin-mouse-pc                                	\
        -fast                                                   \
        -D QT_NO_QWS_CURSOR               			\
        -D QT_QWS_CLIENTBLIT                   			\
        -release                                                \
	-host-little-endian	-little-endian	\
        -opensource						\
        /* 添加内容 */
	-qt-mouse-tslib						\
	-I/opt/tslib/include					\
	-L/opt/tslib/lib					\

同时修改qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf文件

#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC                = arm-none-linux-gnueabi-gcc -lts /* -lts为添加内容 */
QMAKE_CXX               = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK              = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB        = arm-none-linux-gnueabi-g++ -lts

# modifications to linux.conf
QMAKE_AR                = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP             = arm-none-linux-gnueabi-strip

load(qt_config)

参考http://blog.csdn.net/kp339/article/details/53034215

 

你可能感兴趣的:(Qt)