如何从 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();
有什么问题?提前致谢。
几件事:
将事件发送到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::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) 所示,键枚举(即 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();
}
我需要一个用于嵌入式 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();
有什么问题?提前致谢。
几件事:
将事件发送到
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::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) 所示,键枚举(即
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();
}