【发布时间】:2014-04-27 06:38:24
【问题描述】:
我有一个带有输入掩码的QLineEdit,以便可以轻松输入(或粘贴)某种代码。由于您可以将光标放在QLineEdit 中的任何位置,即使没有文本(因为输入掩码中有一个占位符):
如果人们不够粗心和不专心,这会导致他们在文本框的中间输入,而他们应该从开头开始输入。我尝试了通过安装事件过滤器确保光标在焦点开始的简单方法:
bool MyWindowPrivate::eventFilter(QObject * object, QEvent * event)
{
if (object == ui.tbFoo && event->type() == QEvent::FocusIn) {
ui.tbFoo->setCursorPosition(0);
}
return false;
}
这适用于键盘焦点,即按下 ⇆ 或 ⇧+⇆ 时,但是当用鼠标单击时,光标总是结束在我点击的地方。我的猜测是QLineEdit 在获得焦点后在点击自身时设置光标位置,从而撤消我的位置更改。
再深入一点,点击时会引发以下事件¹,从而按顺序改变焦点:
FocusInMouseButtonPressMouseButtonRelease
我无法在事件过滤器中准确捕捉鼠标点击,所以有没有一种很好的方法可以将光标位置设置为仅在控件被聚焦时(无论是通过鼠标还是键盘) ?
¹旁注:我讨厌 Qt 没有任何关于此类常见场景的信号/事件顺序的文档。
【问题讨论】:
-
事件顺序可能取决于不同的因素(包括用户输入)。因此无法描述任何“标准”方式。
-
回复。旁注:我同意。至少获得批准的文档补丁应该不难,如果您想将其写下来并包含在后代中。
-
“我无法在事件过滤器中准确捕捉鼠标点击” 为什么?它们以
QMouseEvent的形式交付。 -
在事件过滤器中做这样的事情不是很明智。原因是您没有过滤掉默认行为。所以在你做完你的事情之后,它会在之后执行默认的
focusInEvent行为。您应该按照 Dmitry 的建议覆盖focusInEvent。 Here你可以看到默认行为。 -
@Kuba:当然可以,但是我必须检查一些仅在鼠标单击之前发生焦点更改的情况下处理鼠标单击的方法,并且如果有人用键盘更改焦点并且不知何故不会搞砸然后单击控件。它的毛比需要的多。