gpt4 book ai didi

c++ - QKeyEvent isAutoRepeat 不起作用?

转载 作者:行者123 更新时间:2023-11-28 02:04:36 25 4
gpt4 key购买 nike

所以,我有一个应用程序,如果按住特定按钮,它会播放音频设备,当释放按钮时,它会停止音频设备。我使用 keyPressEventKeyReleaseEvent 来实现这个类似于下面的代码:

void MainWindow::keyPressEvent(QKeyEvent *event)
{
if(event->isAutoRepeat())
{
event->ignore();
}
else
{
if(event->key() == Qt::Key_0)
{
qDebug()<<"key_0 pressed"<<endl;
}
else
{
QWidget::keyPressEvent(event);
}
}
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
if(event->isAutoRepeat())
{
event->ignore();
}
else
{
if(event->key() == Qt::Key_0)
{
qDebug()<<"key_0 released"<<endl;
}
else
{
QWidget::keyReleaseEvent(event);
}
}
}

但显然 isAutoRepeat 功能不起作用,因为我可以看到连续打印出 key_0 pressedkey_0 released 尽管我没有' 按下后松开 0 键。是我的代码错了还是其他什么地方错了?

谢谢。

编辑

我认为这是因为 MainWindow 失去了键盘焦点。我怎样才能真正找出哪个小部件具有焦点?当按下 Qt::Key_0 时,我实际上正在使用一些小部件,但我认为我将所有这些可能的小部件设置为 Qt::NoFocus,我想它不起作用。

我试图通过执行以下操作来了解哪个小部件具有焦点:

QWidget * wigdet = QApplication::activeWindow();
qDebug()<<wigdet->accessibleName()<<endl;

但它总是打印一个空字符串。如何让它打印具有键盘焦点的小部件的名称?

最佳答案

因此,当我也被这个问题绊倒时(grabKeyboard 并没有真正帮助),我开始深入研究 qtbase。它通过 xcb 连接到 X11,默认情况下,在重复键的情况下,X11 为每个重复键发送一个释放事件,紧接着是一个按键事件。因此,按住一个键会导致一系列 XCB_BUTTON_RELEASE/XCB_BUTTON_PRESS 事件被发送到客户端(使用 xev 或 this page 末尾的源代码进行尝试)。

然后,qt ( qtbase/src/plugins/platforms/xcb/qxcbkeyboard.cpp ) 尝试从这些事件中找出它是否是一个自动重复的情况:当收到一个释放时,它使用一个前瞻功能来计算它是否紧随其后的是一个按下(时间戳足够接近),如果是这样,它假定自动重复。

这并不总是有效,至少不是在所有平台上。对于我的情况(运行 ubuntu 16.04 的老旧的慢速笔记本电脑(Intel® Celeron(R) CPU N2830 @ 2.16GHz × 2)),它有助于在检查之前放置一个 usleep (500),允许发布后的新闻事件事件到达...它在 qxcbkeyboard.cpp 的第 1525 行附近:

    // look ahead for auto-repeat
KeyChecker checker(source->xcb_window(), code, time, state);
usleep(500); // Added, 100 is to small, 200 is ok (for me)
xcb_generic_event_t *event = connection()->checkEvent(checker);
if (event) {
...

归档为 QTBUG-57335 .

Nb:可以使用

改变 X 的行为
Display *dpy=...;
Bool result;
XkbSetDetectableAutoRepeat (dpy, true, &result);

然后它不会在按住键的情况下发送此 release-press-sequences,但使用它需要对 autorepeat-detection-logic 进行更多更改。

关于c++ - QKeyEvent isAutoRepeat 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38102221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com