Как синтезировать события нажатия клавиш?

Я могу получить значения ключа из HAL через функцию обратного вызова в Qt. Создано событие для этого ключа

QKeyEvent *event = new QKeyEvent (QEvent::KeyPress,
inputKey.keyValue,
Qt::NoModifier);

Замечания: inputKey.keyValue Значение ключа получено от уровня HAL.

Теперь мне нужно зарегистрировать событие этой клавиши в Qt, чтобы, если какое-либо нажатие клавиши произошло в ИК-пульте, в соответствующей форме, keyPressEvent(e) или же event(e) получит призыв. и в зависимости от нажатия клавиши будет выполнено конкретное действие.

Примечание: существует более одной формы, в которой срабатывает событие нажатия клавиши, и имеется более одной клавиши «Page_Up, Page_Down, Ok Key и т. Д. …..»

попытался вызвать Postevent () и подключиться (…….), но мне ничего не помогло. KeyPressEvent () не выполняется.

0

Решение

Например. как это:

// receiver is a pointer to QObject
QCoreApplication::postEvent (receiver, event);

Вы можете найти больше информации Вот.

Вы можете переопределить QObject::event() или же QWidget::keyPressEvent в вашем виджете, чтобы получать ключевые события.
Посетите это ссылка на сайт или же ссылка на сайт для дополнительной информации. Смотрите пример кода ниже, который состоит из двух кнопок и метки. Нажатие кнопки pushButton отправляет «Enter нажата» и pushButton_2 отправляет «букву А нажата». Ключевые события получены в event() Функция и метка обновляются соответственно.

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(sendKeyEvent()));
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(sendKeyEvent()));
}

void MainWindow::sendKeyEvent()
{
QObject* button = QObject::sender();
if (button == ui->pushButton)
{
QKeyEvent *event = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
QCoreApplication::postEvent (this, event);
}
else if (button == ui->pushButton_2)
{
QKeyEvent *event = new QKeyEvent (QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
QCoreApplication::postEvent (this, event);
}
}

bool MainWindow::event(QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Enter) {
ui->label->setText("Enter received");
return true;
}
else if (keyEvent->key() == Qt::Key_A)
{
ui->label->setText("A received");
return true;
}
}

return QWidget::event(event);
}
2

Другие решения

Вы можете создать событие в стеке. Тогда используйте QCoreApplication::sendEvent чтобы мероприятие было немедленно доставлено:

QWidget w1, w2;
QKeyEvent event(QEvent::KeyPress, inputKey.keyValue, Qt::NoModifier);
QApplication::sendEvent(&w1, &ev);
QApplication::sendEvent(&w2, &ev);

каждый sendEvent вызовет виджет event метод, который затем вызовет xxxxEvent защищенные методы в зависимости от обстоятельств. Но не делайте этого сами, так как тогда вы обходите фильтры событий глобальных приложений и зависите от деталей реализации.

// WRONG!
w1.event(&ev);
// WRONG and won't compile since keyPressEvent is protected
w2.keyPressEvent(&ev);

Или вы можете создать его в куче. Qt управляет временем жизни события, как только вы его опубликуете. После публикации событие больше не ваше, и вы не можете его повторно использовать. Вы должны создать несколько событий для каждого сообщения. Самый простой способ избежать повторения — создать локальную функцию, которая генерирует события по требованию.

QWidget w1, w2;
auto ev = [=]{ return new QKeyEvent(QEvent::KeyPress, inputKey.keyValue, Qt::NoModifier); };
QApplication::postEvent(&w1, ev());
QApplication::postEvent(&w2, ev());

События будут добавлены в очередь событий основного потока. Как только элемент управления возвращается QApplication::execони будут доставлены виджетам один за другим. Виджеты event метод будет вызываться из QApplication::exec, не от postEvent,

QWidget::event реализация декодирует типы событий и вызывает защищенные удобные обработчики, такие как keyPressEvent, enterEventи т. д. Его реализация осуществляется по следующей схеме:

bool QWidget::event(QEvent * ev) {
switch (ev->type()) {
case QEvent::KeyPress:
keyPressEvent(static_cast<QKeyEvent*>(ev));
return true;
case QEvent::Enter:
enterEvent(static_cast<QEnterEvent*>(ev));
return true;
...
}
return QObject::event(ev);
}

При реализации обработчиков для типов событий, которые имеют такие xxxxEvent Для удобства виртуальных методов вы должны переопределить виртуальный метод, а не event() сам. Таким образом, ваш MainWindow следует переопределить keyPressEvent:

void MainWindow::keyPressEvent(QKeyEvent * event) {
if (event->key() == Qt::Key_Enter)
ui->label->setText("Enter received");
else if (event->key() == Qt::Key_A)
ui->label->setText("A received");
QMainWindow::keyPressEvent(event);
}

Если вы хотите, чтобы ваши ключевые события были немедленно доставлены в ваше окно, и это кажется разумным подходом, ваш sendKeyEvent метод становится намного проще:

void MainWindow::sendKeyEvent()
{
if (sender() == ui->pushButton) {
QKeyEvent event(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
QApplication::sendEvent(this, &event);
}
else if (sender() == ui->pushButton_2) {
QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
QApplication::sendEvent(this, &event);
}
}

Однако есть способ упростить ситуацию. Напомним, что QObject поддерживает динамические свойства. Таким образом, вы можете легко назначить ключи как свойство кнопок и автоматически отправлять событие всякий раз, когда нажимается кнопка со свойством ключа:

static const char keyPropKey[] = "key";

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::sendKeyEvent);
connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::sendKeyEvent);
ui->pushButton.setProperty(keyPropKey, (int)Qt::Key_Enter);
ui->pushButton.setProperty(keyPropKey, (int)Qt::Key_A);
}

void MainWindow::sendKeyEvent()
{
auto key = sender().property(KeyPropKey);
if (key.isValid()) {
QKeyEvent event(QEvent::KeyPress, key.toInt(), Qt::NoModifier);
QApplication::sendEvent(this, &event);
}
}

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

1

По вопросам рекламы [email protected]