如何从QT C ++中的对话框向主mainWindow发送密钥

时间:2018-12-28 14:00:51

标签: c++ qt sendkeys

我需要一个用于嵌入式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 :(得分:1)

几件事:

  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()处理backspacedelete键。


示例

#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();
}