仅由 UDLR 按钮操作的虚拟键盘的 Qt 焦点处理

Posted

技术标签:

【中文标题】仅由 UDLR 按钮操作的虚拟键盘的 Qt 焦点处理【英文标题】:Qt focus handling for virtual keyboard operated only by UDLR buttons 【发布时间】:2011-10-26 02:07:21 【问题描述】:

我在 Qt/Embedded 设备上有一个数据输入屏幕,它只有上/下/左/右/选择按钮。屏幕看起来像一个计算器,顶部有一个 QLineEdit 和一组用于数字的 QPushButton。 UDLR 按钮将焦点移动到 QPushButtons 周围,并选择将按钮的编号附加到 QLineEdit。这很好用。但是,由于 QLineEdit 没有焦点,文本输入光标不会闪烁。 QLineEdit 看起来不像是虚拟键盘按钮按下的接收者,这并不好。

我见过的其他 Qt 虚拟键盘实现不需要它们的键盘按钮来获得焦点,因为它们是触摸或鼠标操作的。因此,QLineEdit 可以始终保持焦点。这不是一个选择。到目前为止,我见过的最好的方法是手动生成焦点事件,以诱使 QLineEdit 在用户真正在虚拟键盘周围导航时认为它具有焦点。我希望有一个更优雅的解决方案,或者可能是一种不同的方式来构建屏幕的实现以避免这个问题。有什么想法吗?

【问题讨论】:

【参考方案1】:

由于您似乎不需要QLineEdit 的真正编辑功能,请将其替换为QLabel。您可以将其嵌套在框架内,使其看起来像一个编辑框。然后,您可以使用不需要焦点的QTimer 模拟闪烁的光标。

以 500 毫秒的间隔启动计时器,并在计时器槽中插入或删除“|”像这样的角色:

void MainWindow::slot_timeout()

    QString labelText = label->text();    
    if(labelText.right(1) == "|")
    
        labelText = labelText.left(labelText.size()-1);
    
    else
    
        labelText += "|";
        
    label->setText(labelText);

按下选择按钮时,在字符串前面插入适当的字符,使闪烁的光标停留在右端。

void MainWindow::slot_selectClick()

    QString labelText = label->text();
    labelText.prepend("x");
    label->setText(labelText);

可能达到你想要的效果就够了。

【讨论】:

这对我来说可能是个好方法。感觉比手动向QLineEdit 发送焦点事件要好,尽管代码要多一些。我得出的结论是,Qt 没有一种方法来指定子焦点或双焦点,就像我需要使用现有的小部件那样,如果这样做,那将是复杂的。您的解决方案的优点是非常容易理解。 我正在跟进这篇文章,以防其他人遇到同样的问题。我最终使用QLineEdit 并手动发送焦点事件。两个原因:QLabel 解决方案很难使光标对齐看起来正确,尤其是在输入框已填满时,并且QLineEdit 对从右到左语言的国际化支持要容易得多。 这些都是重要的考虑因素。如果您可以将其发布为答案,那就太好了,特别是如果有一些有用的代码。在这里“接受”你自己的答案是完全可以接受的:)

以上是关于仅由 UDLR 按钮操作的虚拟键盘的 Qt 焦点处理的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个可以将键发送到控件而不会失去焦点的按钮 - 虚拟键盘

qt的键盘事件

Qt 虚拟键盘和 QInputContextFactory

qt焦点左右键切换问题,求大神指导!!

使用java更改焦点窗口

Qt中的键盘事件,以及焦点的设置(比较详细)