我正在编写一个 Qt 程序来模拟一个硬件,我想模拟按钮按下、按住和释放事件。在我的应用程序中,我想处理键盘和鼠标点击的输入,以使用户(即我)方便。我注意到一些奇怪的行为,但我不明白。
该应用程序使用 QPushButtonautoRepeat
启用并有 100 毫秒autoRepeatDelay
and autoRepeatInterval
. If I 鼠标点击在按钮上,我会交替收到“按下”和“释放”事件。我本来期望看到 1 到 N-1 个“按下”事件,然后是一个“释放”事件。为什么 Qt 会这样?
我还实现了以下代码来处理来自keyboard:
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 中可行吗?
这是我的解决方案:首先我禁用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 毫秒检查一次(使用 QTimer)。如果标志为真,我打电话on_upButton_pressed()
再次。这意味着:
- 每次鼠标单击或按下键盘按钮都会生成一个“Press”事件
- “Press”事件设置一个由 QTimer 检查的标志
- 如果标志是
true
,另一个“Press”事件生成
- 当释放鼠标或键盘按钮时,会生成“Release”事件并清除该标志。
现在正在工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)