2014-10-15 2 views
1

Я знаю, что было несколько тем, похожих на этот, они не задают точно такой же вопрос, и их ответы не то, что мне нужно. Я попытаюсь кратко объяснить свою ситуацию.различают 2 нажатия клавиш клавиатуры с использованием eventfilter (встроенный linux)

У меня есть две клавиатуры, одна стандартная USB-клавиатура (HID), другая - клавиатура GPIO. Есть ключи, которые обычно сообщаются обеими клавиатурами, но мне нужно принимать разные действия в моем приложении Qt, в зависимости от того, какая клавиша нажата.

В этот момент обе клавиатуры работают нормально одновременно, но я просто не могу найти способ идентифицировать, с какой клавиатуры нажимается клавиша.

Возможно ли это? Я использую Qt 4.8.5, и я могу перекомпилировать его, если это необходимо для выполнения того, что мне нужно.

Любая помощь, подсказка, подсказка будут высоко оценены.

Спасибо за помощь,

Уильям

ответ

0

Qt не имеет эту функцию, чтобы определить, какие нажатия клавиатуры. Вы должны использовать интерфейс событий Linux, чтобы различать два входа. Когда какой-либо ввод доступен на одном из ваших аппаратных средств, вы можете получить к нему доступ, читая устройства символов под каталогом /dev/input/. Например, у вас есть файл вроде /dev/input/by-id/usb-0b38_0010-event-kbd, который можно прочитать, чтобы увидеть ввод с конкретной клавиатуры.

Вы можете прочитать конкретные файлы для двух клавиатур в двух отдельных потоках, и каждый раз, когда вы читаете некоторые новые данные из одного из них, отправляйте сигнал в свой основной поток, чтобы уведомить, что вход от какой из клавиатур:

в первой теме:

QFile file("/dev/input/by-id/FileForKeyboard1"); 

if(file.open(QIODevice::ReadOnly | QIODevice::Text)) 
{ 
    QTextStream stream(&file); 
    while(true) 
    { 
     stream.read(1); 
     emit keyBoard1_Pressed(); 
    } 
} 

Во втором потоке:

QFile file("/dev/input/by-id/FileForKeyboard2"); 

if(file.open(QIODevice::ReadOnly | QIODevice::Text)) 
{ 
    QTextStream stream(&file); 
    while(true) 
    { 
     stream.read(1); 
     emit keyBoard2_Pressed(); 
    } 
} 

Обратите внимание, что вы должны иметь корневой доступ для чтения из этих е Ильз.