Обрабатывать клавиатуру в C ++ кроссплатформенным способом - PullRequest
0 голосов
/ 02 мая 2018

Я создал приложение на C ++, используя Qt. Я хочу, чтобы, если пользователь нажал на кнопку с именем btnA, то программа должна эмулировать ее, как если бы нажата A .

Я искал в Google и нашел решение, зависящее от платформы. Я хочу, чтобы он был кроссплатформенным. Есть ли API? Я бы предпочел кроссплатформенное (или Linux) решение.

Edit: -

вот мой код и он не работает: -

#include "calculator.h"
#include "ui_calculator.h"
#include <QKeyEvent>

Calculator::Calculator(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Calculator),
    DisplayString("")
{
     ui->setupUi(this);
     setFixedSize(this->size());

    //Connected all buttons to one slot 
     connect(ui->Button1,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button2,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button3,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button4,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button5,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button6,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button7,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button8,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button9,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->Button0,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));

     connect(ui->ButtonAddition,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->ButtonMinus,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->ButtonModulas,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->ButtonDivide,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
     connect(ui->ButtonMultiplication,SIGNAL(clicked()),this,SLOT(CalButtonPressed()));
}

Calculator::~Calculator()
{
    delete ui;
}


void Calculator::CalButtonPressed()
{
    QPushButton *senderbtn = static_cast<QPushButton*>(sender());
    QString string = senderbtn->text();

    char ch = string.at(0).toLatin1();
// for testing I have taken only one button
    QKeyEvent * event = new QKeyEvent(QEvent::KeyPress,Qt::Key_A,Qt::NoModifier,nullptr);
    QApplication::postEvent(ui->Input,event);


}

main.cpp

#include <QApplication>
#include <QFile>
#include <cstring>
#include "calculator.h"

int main(int argc,char **argv)
{
    QApplication *app= new QApplication(argc,argv);
    app->setWindowIcon(QIcon(":/Images/Icon.png"));


    Calculator *cal = new Calculator(nullptr);
    cal->show();

    return  app->exec();

}

Он должен отображать 'a' в QLineEdit виджете с именем Input

1 Ответ

0 голосов
/ 02 мая 2018

Вам нужно создать QKeyEvent для этого, как показано ниже.

QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, 0);

Приведенный выше синтаксис создает QKeyEvent типа KeyPress с нажатой клавишей как A и сообщает, что в процессе не было нажатых модификаторов.

Как только это будет создано, вы можете добавить его в eventQueue, используя postEvent.

QApplication::postEvent(this, event);

Qt Документация, которую вы можете просмотреть для лучшего понимания того, что вы собираетесь использовать:

Я использовал вышеупомянутое в случае кроссплатформенного решения для Windows и Mac. Надеюсь, это будет хорошо работать и для Linux.


Обновление:

Поскольку вы хотите обновить строку редактирования текстом, вам нужно сделать следующее:

QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, QKeySequence(Qt::Key_A).toString());
// This is because QLineEdit does not deduce the text from the event type, but instead just adds the text it receives.

Это обязательно обновит QLineEdit символом «A» при нажатии button A. Очевидно, после того, как вы позвоните postEvent с новым event, созданным выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...