在Qt中设置QLineEdit的焦点

23

我有一个qt问题。我希望在应用程序启动时将QLineEdit小部件设置为焦点。以以下代码为例:

#include <QtGui/QApplication>
#include <QtGui/QHBoxLayout>
#include <QtGui/QPushButton>
#include <QtGui/QLineEdit>
#include <QtGui/QFont>


 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QWidget *window = new QWidget();
     window->setWindowIcon(QIcon("qtest16.ico"));
     window->setWindowTitle("QtTest");

     QHBoxLayout *layout = new QHBoxLayout(window);

     // Add some widgets.
     QLineEdit *line = new QLineEdit();

     QPushButton *hello = new QPushButton(window);
     hello->setText("Select all");
     hello->resize(150, 25);
     hello->setFont(QFont("Droid Sans Mono", 12, QFont::Normal));

     // Add the widgets to the layout.
     layout->addWidget(line);
     layout->addWidget(hello);

     line->setFocus();

     QObject::connect(hello, SIGNAL(clicked()), line, SLOT(selectAll()));
     QObject::connect(line, SIGNAL(returnPressed()), line, SLOT(selectAll()));

     window->show();
     return app.exec();
 }

为什么line->setFocus()只有在小部件布局后才能将焦点设置在应用程序启动的行小部件上,而且如果在它之前使用,就无法工作?

4个回答

27

另一个可能有用的技巧是使用 singleshot 定时器:

QTimer::singleShot(0, line, SLOT(setFocus()));

实际上,这会在事件系统“空闲”后立即调用QLineEdit实例的setFocus()槽,即在小部件完全构建之后的某个时间。


1
这个很好用,事件系统的免费使用增加了正确聚焦于我所创建的新行编辑器的优势。谢谢。 - Ja8zyjits

26

键盘焦点与小部件tab顺序有关,而默认的tab顺序基于小部件构造的顺序。因此,创建更多的小部件会改变键盘焦点。这就是为什么您必须在最后调用QWidget::setFocus的原因。

我建议使用QWidget的子类作为主窗口,并重写showEvent虚函数,然后将键盘焦点设置为lineEdit。这将始终使lineEdit在窗口显示时获得焦点。


2
小更正:选项卡顺序不是子元素被构建的顺序,而是它们被添加到父元素的顺序。 - Marc Mutz - mmutz
这可能是真的,但我是在转述Qt文档,它陈述道: “您可以使用QWidget::setTabOrder()自定义选项卡顺序。(如果您不这样做,Tab键通常按小部件构造的顺序移动焦点。)” - Judge Maygarden

4
也许这是一次更新,因为上一个回答是在2012年,而提问者最后编辑了问题是在2014年。我让它工作的方法是更改策略,然后设置焦点。
line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();

1
在Qt中,setFocus()是一个槽函数,您可以尝试其他重载方法,该方法使用Qt::FocusReason参数,例如下面所示的行:
line->setFocus(Qt::OtherFocusReason);

您可以在以下链接中了解有关焦点原因选项的信息:

http://doc.trolltech.com/4.4/qt.html#FocusReason-enum


嗨,milot。谢谢你的回答。问题是,即使我改成你写的那样,它也不起作用。由于它是一个小部件插槽,我假设我可以在应用程序启动时将信号连接到它。你知道那个信号是什么吗?再次感谢。 - hyperboreean
它可以是任何信号,只要其签名与插槽的签名匹配,因此可以连接到不带任何参数的信号。 - milot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接