Qt 如何将键盘光标/焦点移动到QLineEdit?

Qt 如何将键盘光标/焦点移动到QLineEdit?,qt,Qt,我正在打开一个包含QLineEdit的QDialog。我希望QLineEdit最初具有键盘焦点,以闪烁的光标作为视觉提示。很简单,对吧 调用line\u edit->setFocus()无效 调用line\u edit->grabKeyboard()将为其提供输入焦点,但 闪烁的插入符号不会移动到line\u edit 如果我点击另一个QLineEdit,闪烁的插入符号会出现,但按键仍会传递到line\u edit 如果两者都不做,我必须单击进入行编辑以获取插入符号和输入焦点。查看QLine

我正在打开一个包含QLineEdit的QDialog。我希望QLineEdit最初具有键盘焦点,以闪烁的光标作为视觉提示。很简单,对吧

调用
line\u edit->setFocus()
无效

调用
line\u edit->grabKeyboard()
将为其提供输入焦点,但

  • 闪烁的插入符号不会移动到
    line\u edit
  • 如果我点击另一个QLineEdit,闪烁的插入符号会出现,但按键仍会传递到
    line\u edit
如果两者都不做,我必须单击进入
行编辑
以获取插入符号和输入焦点。查看
QLineEdit::mousePressEvent
的源代码,关键功能似乎是
QWidgetLineControl::moveCursor
,但这无法通过公共API访问,深入查看源代码也没有任何希望

那么,我该如何移动该死的键盘输入光标呢

如何将键盘输入光标设置为QLineEdit小部件

来自对此线程的答复之一:

在我找到优雅的聚焦方式之前,我开发了自己的:

void forceFocus(QWidget* widget)
{
    // unless set active, no stable set focus here
    widget->activateWindow();
    // the event object is released then in event loop (?)
    QFocusEvent* eventFocus = new QFocusEvent(QEvent::FocusIn);
    // posting event for forcing the focus with low priority
    qApp->postEvent(widget, (QEvent *)eventFocus, Qt::LowEventPriority);
}

被接受的答案对我不起作用。
qApp->focusWidget()
已正确更新,但插入符号未显示。我尝试了很多变化,比如
grabKeyboard()
setReadOnly()
setCursorPosition()
activateWindow()
cursorBackward()
cursorForward()
cursorFlashTime()
等等,但都没有效果。他们发现光标在正确的位置,只是没有被画出来

不确定我的场景与OP有何不同。比如,在响应另一个按钮按下后,我正在调用
setFocus()
,但在其他方面相当标准

最后,利用OP中的线索,这种大锤式的方法让我达到了目的:

QPoint pos(line_edit->width()-5, 5);
QMouseEvent e(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, 0);
qApp->sendEvent(line_edit, &e);
QMouseEvent f(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, 0);
qApp->sendEvent(line_edit, &f);

显示对话框后,哪个小部件获得焦点?您可以使用GammaRay/
QApplication
进行检查。尽管您的链接中引用的原因令人怀疑,但这是可行的:“键盘焦点与小部件选项卡顺序有关,默认选项卡顺序基于小部件的构造顺序。因此,创建更多小部件会改变键盘焦点。这就是为什么你必须让QWidget::setFocus调用在最后一次。”--我在构造结束时调用setFocus(),在创建和添加了所有小部件之后。还有一些事情正在发生。正确的,这就是有多少stackoverflow页面是由人编写的。所有事情都需要在实践中得到验证,有很多不准确的陈述。
QPoint pos(line_edit->width()-5, 5);
QMouseEvent e(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, 0);
qApp->sendEvent(line_edit, &e);
QMouseEvent f(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, 0);
qApp->sendEvent(line_edit, &f);