Как отправить ключ родительскому mainWindow из диалога в QT C ++ - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужна виртуальная клавиатура для встроенного приложения Linux (не QML).Я не мог найти лучший способ, поэтому сейчас я пытаюсь его создать.Я хочу диалоговое окно, полное кнопок, которое отправляет ключи родителю mainWindow.Работает без ошибок, но ничего не происходит в lineEdit.

keyboard.cpp

Keyboard::Keyboard(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Keyboard)
{
    ui->setupUi(this);
    mainWindow = this->parent();
}

void Keyboard::on_btnA_clicked()
{
    qDebug() << "Test1";
    QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
    qDebug() << "Test2";
    QApplication::sendEvent(mainWindow, &event);
    qDebug() << "Test3";
}

И в mainWindow.cpp для открытия диалогового окна клавиатуры:

  keyboard->show();
  ui->lineEdit->setFocus();

В чем проблема?Заранее спасибо.

1 Ответ

0 голосов
/ 28 декабря 2018

Несколько вещей:

  1. Для отправки события в mainWindow требуется mainWindow, чтобы обработать передачу события в объект QLineEdit, не видя остальной части кода, который я могуне говорите, если это делается или нет;альтернатива - отправка непосредственно на QLineEdit следующим образом:

    QApplication::sendEvent(lineEdit, &event);
    


  2. Для конструктора QKeyEvent также требуется четвертый параметр - строкадля отправки в данном случае "a".

    QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
    

    должно быть

    QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "a");
    

    для отправки "a".


В зависимости от конкретной реализации вам также может потребоваться отправить QEvent::KeyRelease после QEvent::KeyPress, то есть

QKeyEvent event1(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "b");
QKeyEvent event2(QEvent::KeyRelease, Qt::Key_A, Qt::NoModifier);
QApplication::sendEvent(edit, &event1);
QApplication::sendEvent(edit, &event2);


Как указывает (2), перечисление ключей (то есть Qt::Key_A) не отправляет "a", как вы ожидаете, вместо этого отправляемая строка определяется четвертым параметром в конструкторе QKeyEvent, т.е.1047 *

QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "a");
QApplication::sendEvent(lineEdit, &event);

Эквивалентно

QKeyEvent event(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "a");
QApplication::sendEvent(lineEdit, &event);


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

lineEdit->setText(lineEdit->text().append("a"));

и использовать QLineEdit::backspace() и QLineEdit::delete() для обработки клавиш backspace и delete.


Пример

#include <QtWidgets/QApplication>
#include <qwidget.h>
#include <qmainwindow.h>
#include <qlineedit.h>
#include <qboxlayout.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMainWindow* main = new QMainWindow;
    QWidget* central = new QWidget();
    QBoxLayout* layout = new QBoxLayout(QBoxLayout::LeftToRight);
    central->setLayout(layout);
    QLineEdit* edit = new QLineEdit(central);
    edit->setAlignment(Qt::AlignCenter);
    layout->addWidget(edit);

    edit->setText("sometext");
    edit->backspace();
    edit->setText(edit->text().append("a"));

    main->setCentralWidget(central);
    main->resize(600, 400);
    main->show();

    return a.exec();
}
...