仅由 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 焦点处理的主要内容,如果未能解决你的问题,请参考以下文章