Как эмулировать щелчок QPushButton в Qt с помощью QEvents - PullRequest
2 голосов
/ 02 января 2012

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

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, верно?

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

Ответы [ 2 ]

1 голос
/ 13 января 2012

Решение этого вопроса было на самом деле довольно простым.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 голос
/ 03 января 2012

[QT_FOLDER] /src/gui/widgets/qpushbutton.cpp: строка 459

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

Создайте класс MyPushButton и переопределите keyPressEvent. Затем просто обработайте Enter и Return с помощью вызова , нажмите

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

Edit:

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

...