2012-01-02 4 views
2

У меня есть пользовательское устройство ввода и встроенная система, и вам нужно перевести вход в соответствующие события в Qt. В моем текущем представлении у меня есть QListView и некоторые QPushButtons. Я использую следующий код в своем виджетах.Как эмулировать QPushButton в Qt с QEvents

QKeyEvent * e = NULL; 
if (cmd.up.value) 
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, 0, 0); 
else if (cmd.down.value) 
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, 0, 0); 
else if (cmd.left.value) 
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Left, 0, 0); 
else if (cmd.right.value) 
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Right, 0, 0); 
else if (cmd.ok.value) 
    e = new QKeyEvent(QEvent::KeyPress, Qt::Key_Space, 0, 0); 

if (e) 
    QApplication::postEvent(this->focusWidget(), e); 

Я могу перемещаться вверх/вниз/вправо/влево между списком и кнопками, но я не могу нажать на кнопки. Я пробовал использовать Qt :: Key_Enter и Qt :: Key_Return, но не работает.

Если вы запускаете приложение на моем компьютере, пробел или левую кнопку мыши на моей клавиатуре дает щелчок на кнопке. Это означает, что где-то, событие изменилось на то, что кнопка понравилась лучше, чем получить Qt :: Key_Space прямо, не так ли?

У кого-нибудь есть идея, как я могу это решить? Я могу проверить, какие (если таковые имеются) кнопка имеет фокус и нажмите на нее вручную, но это не очень элегантный кодирования ...

+0

Вы пытаетесь с помощью QMouseEvent отправить сообщение мышью на кнопку? – Chris

+0

Есть ли какая-то проблема с моим ответом? Скажите, есть ли, я мог бы помочь больше. – 0xbaadf00d

ответ

1

Решение на самом деле было довольно простым. QPushButton не нажимается на KeyPress, а на KeyRelease. Новый код ниже.

if (cmd.up.value) 
{ 
    QApplication::postEvent(this->focusWidget, 
          new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, 0, 0)); 
} 
else if (cmd.down.value) 
{ 
    QApplication::postEvent(this->focusWidget, 
          new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, 0, 0)); 
} 
else if (cmd.left.value) 
{ 
    QApplication::postEvent(this->focusWidget, 
          new QKeyEvent(QEvent::KeyPress, Qt::Key_Left, 0, 0)); 
} 
else if (cmd.right.value) 
{ 
    QApplication::postEvent(this->focusWidget, 
          new QKeyEvent(QEvent::KeyPress, Qt::Key_Right, 0, 0)); 
} 
else if (cmd.ok.value) 
{ 
    QApplication::postEvent(this->focusWidget, 
          new QKeyEvent(QEvent::KeyPress, Qt::Key_Space, 0, 0)); 
    QApplication::postEvent(this->focusWidget, 
          new QKeyEvent(QEvent::KeyRelease, Qt::Key_Space, 0, 0)); 
} 
1

[QT_FOLDER] /src/gui/widgets/qpushbutton.cpp: линия 459

QPushButton принимает Key_Enter и Key_Return, если defaultButton имеет значение true. Я не знаю, где кнопка пробела изменена на что-то другое, но вот мое исправление:

Создайте класс MyPushButton и повторно заполните keyPressEvent. Затем просто выполните ввод и возврат с вызовом на .

Это должно быть очень просто.

Edit:

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

+0

Спасибо за ответ. Я пробовал оба подхода и оказался где-то посередине. Виджеты, которые нуждаются в этом вступлении, внедряют обработчик событий, который преобразует пользовательский ввод в QEvents, который нужен дочерним элементам этого виджета. Кнопки, которые я использовал, были установлены в autoDefault, поэтому из исходного кода кажется, что это тоже сработало. В любом случае - работа с комбинацией ваших предложений - пользовательский обработчик ввода, вызывающий кнопку click() на активной кнопке. Благодарю. – anr78

+0

Я рад, что у вас это работает :) Счастливые времена кодирования! : D – 0xbaadf00d