Мне нужна виртуальная клавиатура для встроенного приложения Linux (не QML). Я не мог найти лучший способ, поэтому сейчас я пытаюсь его создать. Я хочу диалог, полный кнопок, который отправляет ключи родителю mainWindow
, Он работает без ошибок, но ничего не происходит в lineEdit
,
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();
В чем проблема? Заранее спасибо.
Несколько вещей:
Отправка мероприятия на mainWindow
требует mainWindow
обрабатывать передачу события в QLineEdit
объект, не видя остальной код, я не могу сказать, делается это или нет; альтернатива отправка непосредственно на QLineEdit
как это:
QApplication::sendEvent(lineEdit, &event);
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
конструктор, т.е.
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();
}
Других решений пока нет …