我需要一个用于嵌入式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();
出什么问题了?预先感谢。
答案 0 :(得分:1)
几件事:
将事件发送到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();
}