思路与目标已经明确:

1.在qdevicediscovery_static.cpp文件中实现检测键鼠插入与移除,并发送相应的信号deviceDetected/deviceRemoved即可。
2.检测键鼠的插入与移除可以检测文件系统中/dev/input/目录下设备节点的变化,具体的监听采用QFileSystemWatcher类的路径监听(directoryChanged)。

添加监听

在Qt的源码目录下qtbase/src/platformsupport/input/evdevmouse/。

1.复制qdevicediscovery_static.cpp,qdevicediscovery_hotplug.cpp和qdevicediscovery_hotplug_p.h文件,修改文件中的static关键字为hotplug。

2.由于需要保持监听长时存在,因此监听的实例声明要放在头文件中,并添加相应头文件,由于需要记住上一次添加的设备,因此仿造.cpp文件实现添加一个QStringList变量。
添加头文件:#include <QFileSystemWatcher>
                     #include <QStringList>
声明监听实例:QFileSystemWatcher *m_fileWatcher;
声明上一次添加设备的列表:QStringList m_devices;
声明信号函数:

private slots:
void handleHotPlugWatch(const QString &path);


3.初始化监听变量与信号监听函数实现

// 初始化文件监听器
m_fileWatcher = new QFileSystemWatcher(this);
m_fileWatcher->addPath(QString::fromLatin1(QT_EVDEV_DEVICE_PATH));// "dev/input/"
connect(m_fileWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(handleHotPlugWatch(QString)));


2信号监听函数实现


void QDeviceDiscoveryHotPlug::handleHotPlugWatch(const QString &path)
{
    if(path.compare(QString::fromLatin1(QT_EVDEV_DEVICE_PATH)))
    {
        return;
    }
    QStringList devices;
    // 先移除原来的设备
	foreach (const QString &device, m_devices)
		deviceRemoved(device);

    // 获取现在的设备
    // 注,这里获取的设备已经经过过滤,原因是在对该类进行实例化的时候
    // 已经传进了筛选参数,如:QDeviceDiscovery::Device_Keyboard
    devices = this->scanConnectedDevices();

    // 重新添加设备
	foreach (const QString &device, devices)
		deviceDetected(device);
}


4.修改QStringList QDeviceDiscoveryHotPlug::scanConnectedDevices()函数,保存添加设备的列表

将QStringList devices;改成m_devices.clear();,用以清除上一次的值。将该函数中的devices全部改成m_devices,用以保存新的值。


修改devicediscovery.pri文件中的编译选项


} else: contains(QT_CONFIG, evdev) {
	SOURCES += $$PWD/qdevicediscovery_hotplug.cpp
	HEADERS += $$PWD/qdevicediscovery_hotplug_p.h
}


修改文件完成后,重新make/make install,将安装后的qt文件移植到开发板上即可。