Qt keyPressEvent," Hold"和keyReleaseEvent使用按钮/鼠标点击处理

时间:2014-09-14 21:59:27

标签: qt

我正在编写一个Qt程序来模拟一个硬件,我想模拟按下按钮,按住和释放事件。在我的应用程序中,我想处理键盘和鼠标点击的输入,以方便用户(即我)。我注意到了一些奇怪的行为,我不明白。

该应用程序使用启用了autoRepeat的QPushButton和100毫秒autoRepeatDelayautoRepeatInterval。如果我在按钮上鼠标单击,我会收到交替的“按下”和“已发布”事件。我本来期望看到1到N-1“紧迫”事件,接着是“已发布”事件。为什么Qt表现那样?

我还实现了以下代码来处理来自键盘的按钮:

void MyApp::keyPressEvent(QKeyEvent *event)
{
    QString s = QString("My PRESS key is %1. The counter is %2").arg(event->text(), QString::number(keyCounter));
    qDebug() << s;
    keyCounter++;
}

void MyApp::keyReleaseEvent(QKeyEvent *event)
{
    QString s = QString("My RELEASE key is %1. The counter is %2").arg(event->text(), QString::number(keyCounter));
    qDebug() << s;
    keyCounter = 0;
}

bool MyApp::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        this->keyPressEvent(dynamic_cast<QKeyEvent*>(event));
        return true;
    }
    else if (event->type() == QEvent::KeyRelease)
    {
        this->keyReleaseEvent(dynamic_cast<QKeyEvent*>(event));
        return  true;
    }
    else
    {
        return QObject::eventFilter(obj, event);
    }
}

在这里,我看到两种类型的行为。对于字母数字键,我看到交替的“按下”和“已发布”事件。对于箭头键,我只看到“已发布”事件。再次,我本来期望看到1到N-1“紧迫”事件,然后是“释放”事件。为什么箭头键的行为与字母数字键不同?

我在Qt尝试做的是什么?

2 个答案:

答案 0 :(得分:1)

这是我的解决方案:首先我禁用autoRepeat并停止处理keyPressEvents因为我发现箭头键没有生成它们。相反,我为我想要使用的键盘按钮注册了快捷方式:

QShortcut *shortcutUp = new QShortcut(QKeySequence("Up"), this);
QObject::connect(shortcutUp, SIGNAL(activated()), this, SLOT(on_upButton_pressed()));
shortcutUp->setAutoRepeat(false);

然后在on_upButton_pressed()函数中(例如)我设置了一个标志,表示按下了按钮。该标志在on_upButton_released()功能中被清除。以100 ms的间隔检查该标志(使用QTimer)。如果该标志为真,我再次呼叫on_upButton_pressed()。这意味着:

  • 每次单击鼠标或键盘按钮都会生成一个“按下”事件
  • “按”事件设置由QTimer检查的标志
  • 如果标记为true,则会生成另一个“按”事件
  • 释放鼠标或键盘按钮时,将生成“Release”事件并清除标记。

现在正在运作。

答案 1 :(得分:0)

这是由QT中的某些键生成自动重复事件引起的:

在这里,我看到两种类型的行为。对于字母数字键,我看到了 交替发生“按下”和“释放”事件。对于箭头键,我只 请参阅“已发布”事件。同样,我本来希望看到1 N-1个“按下”事件,然后是“释放”事件。为什么箭 键的行为与字母数字键不同?

在QT5中,您可以检测到由isAutoRepeat()对象的功能QKeyEvent按下的键。如果按住该键,则isAutoRepeat()将返回true。例如:

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (event->isAutoRepeat())
    {
        return;
    }

    if (!event->isAutoRepeat())
    {
        qDebug() << "[MainWindow::keyPressEvent()] " << event->key() << "; " << event->isAutoRepeat();
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    if (event->isAutoRepeat())
    {
        return;
    }
    qDebug() << "[MainWindow::keyReleaseEvent()] " << event->key() << "; " << event->isAutoRepeat();
}