【发布时间】:2016-06-29 14:11:31
【问题描述】:
所以,我有一个应用程序,如果按住特定按钮,它会播放音频设备,当释放按钮时,它会停止音频设备。我使用keyPressEvent 和KeyReleaseEvent 来实现这个,类似于下面的代码:
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 pressed 和key_0 released 连续打印出来,尽管事实上我在按下它之后没有释放0 键。是我的代码错了还是有其他问题?
谢谢。
编辑
我认为这是因为MainWindow 失去了键盘焦点。我如何才能真正找出哪个小部件具有焦点?当按下Qt::Key_0 时,我实际上正在使用一些小部件,但我认为我将所有可能的小部件设置为Qt::NoFocus,我想它不起作用。
我试图通过执行以下操作来了解哪个小部件具有焦点:
QWidget * wigdet = QApplication::activeWindow();
qDebug()<<wigdet->accessibleName()<<endl;
但它总是打印一个空字符串。如何让它打印具有键盘焦点的小部件的名称?
【问题讨论】:
-
你的班级是
MainWindow还是ConsoleMainWindow?好像你的问题有错别字 -
其次,你的代码对我有用,刚刚测试过。文档状态:
Note that if the event is a multiple-key compressed event that is partly due to auto-repeat, this function could return either true or false indeterminately。你是这种情况吗? -
@IAmInPLS 抱歉打错了,我改了。我的课是 MainWindow。
-
您的操作系统和 Qt 版本是什么?
-
@IAmInPLS Ubuntu LTS 14.04 和 Qt 5.2.1。我不认为该事件是多键压缩事件。它所做的只是在按下时增加音频设备的音量并在释放时减小它。这是一个多键压缩事件吗?