如何从 QT C++ 中的对话框将密钥发送到父 mainWindow

How to send key to parent mainWindow from dialog in QT C++

我需要一个用于嵌入式 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. 将事件发送到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::KeyPress 之后发送 QEvent::KeyRelease,即

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