Как отправить ключ родительскому mainWindow из диалога в QT Stack Overflow

Мне нужна виртуальная клавиатура для встроенного приложения 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();

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

2

Решение

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

  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",

  1. В зависимости от конкретной реализации вам также может потребоваться отправить 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. Как указывает (2), перечисление ключей (т.е. Qt::Key_A) не отправляет "a" как и следовало ожидать, отправляемая строка определяется четвертым параметром в QKeyEvent конструктор, т.е.

    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);
    

  1. С помощью 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();
}
2

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

Других решений пока нет …

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