我可以通过Qt中的回调函数从HAL获取键值。为该键创建的事件由
QKeyEvent *event = new QKeyEvent (QEvent::KeyPress,
inputKey.keyValue,
Qt::NoModifier);注意:inputKey.keyValue密钥值是从HAL层收到的。
现在我需要在Qt中注册这个按键事件,这样如果在IR Remote中发生任何按键事件,那么在相应的形式中,keyPressEvent(e)或event(e)将被调用。并且基于按键,特定的动作将被执行。
注意:存在多个窗体,其中将触发按键事件,并且存在多个键"Page_Up、Page_Down、Ok key Et.....“
尝试调用Postevent()和connect(.......)但对我没什么帮助。没有执行KeyPressEvent()。
发布于 2015-08-25 14:04:28
例如:
// receiver is a pointer to QObject
QCoreApplication::postEvent (receiver, event);你可以找到更多信息here。
您可以在小部件中重新实现QObject::event()或QWidget::keyPressEvent来接收关键事件。有关更多信息,请访问此link或link。请参阅下面的示例代码,该代码由两个按钮和一个标签组成。点击pushButton发送'enter pressed‘,点击pushButton_2发送'letter A pressed’。在event()函数中接收关键事件,并相应地更新标签。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(sendKeyEvent()));
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(sendKeyEvent()));
}
void MainWindow::sendKeyEvent()
{
QObject* button = QObject::sender();
if (button == ui->pushButton)
{
QKeyEvent *event = new QKeyEvent (QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
QCoreApplication::postEvent (this, event);
}
else if (button == ui->pushButton_2)
{
QKeyEvent *event = new QKeyEvent (QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
QCoreApplication::postEvent (this, event);
}
}
bool MainWindow::event(QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Enter) {
ui->label->setText("Enter received");
return true;
}
else if (keyEvent->key() == Qt::Key_A)
{
ui->label->setText("A received");
return true;
}
}
return QWidget::event(event);
}发布于 2015-08-25 21:51:56
您可以在堆栈上创建事件。然后使用QCoreApplication::sendEvent立即交付事件:
QWidget w1, w2;
QKeyEvent event(QEvent::KeyPress, inputKey.keyValue, Qt::NoModifier);
QApplication::sendEvent(&w1, &ev);
QApplication::sendEvent(&w2, &ev);每个sendEvent将调用小部件的event方法,然后该方法将根据需要调用xxxxEvent保护的方法。但是不要自己做,因为这样会绕过应用程序全局事件过滤器,并依赖于实现细节。
// WRONG!
w1.event(&ev);
// WRONG and won't compile since keyPressEvent is protected
w2.keyPressEvent(&ev);或者,您可以在堆上创建它。一旦你发布了事件,Qt就会管理它的生命周期。在你发布后,事件不再是你的,你不能再使用它。您必须为每个帖子创建多个事件。避免重复的最简单方法是创建一个按需生成事件的本地函数。
QWidget w1, w2;
auto ev = [=]{ return new QKeyEvent(QEvent::KeyPress, inputKey.keyValue, Qt::NoModifier); };
QApplication::postEvent(&w1, ev());
QApplication::postEvent(&w2, ev());这些事件将被添加到主线程的事件队列中。一旦控制返回给QApplication::exec,它们将被逐个传递给小部件。小部件的event方法将从QApplication::exec调用,而不是从postEvent调用。
QWidget::event实现对事件类型进行解码,并调用受保护的便利处理程序,如keyPressEvent、enterEvent等。它的实现遵循以下模式:
bool QWidget::event(QEvent * ev) {
switch (ev->type()) {
case QEvent::KeyPress:
keyPressEvent(static_cast<QKeyEvent*>(ev));
return true;
case QEvent::Enter:
enterEvent(static_cast<QEnterEvent*>(ev));
return true;
...
}
return QObject::event(ev);
}在为具有此类xxxxEvent方便的虚方法的事件类型实现处理程序时,应该重新实现虚方法,而不是event()本身。因此,您的MainWindow应该重新实现keyPressEvent
void MainWindow::keyPressEvent(QKeyEvent * event) {
if (event->key() == Qt::Key_Enter)
ui->label->setText("Enter received");
else if (event->key() == Qt::Key_A)
ui->label->setText("A received");
QMainWindow::keyPressEvent(event);
}如果您希望将关键事件立即传递到窗口,这似乎是一个合理的方法,那么您的sendKeyEvent方法将变得简单得多:
void MainWindow::sendKeyEvent()
{
if (sender() == ui->pushButton) {
QKeyEvent event(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
QApplication::sendEvent(this, &event);
}
else if (sender() == ui->pushButton_2) {
QKeyEvent event(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
QApplication::sendEvent(this, &event);
}
}不过,还有一种方法可以进一步简化事情。回想一下,QObject支持动态属性。因此,您可以轻松地将键指定为按钮的属性,并在按下具有键属性的按钮时自动发送事件:
static const char keyPropKey[] = "key";
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::sendKeyEvent);
connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::sendKeyEvent);
ui->pushButton.setProperty(keyPropKey, (int)Qt::Key_Enter);
ui->pushButton.setProperty(keyPropKey, (int)Qt::Key_A);
}
void MainWindow::sendKeyEvent()
{
auto key = sender().property(KeyPropKey);
if (key.isValid()) {
QKeyEvent event(QEvent::KeyPress, key.toInt(), Qt::NoModifier);
QApplication::sendEvent(this, &event);
}
}最后,作为风格上的吹毛求疵:没有理由让ui成员成为指针。通过将它用作直接成员,可以避免一个堆分配和大量的间接操作。
https://stackoverflow.com/questions/32196179
复制相似问题