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()只有在布局小部件之后放置它并且在它不起作用之前使用它时才将焦点设置在行小部件@app启动上?

4

4 回答 4

26

键盘焦点与小部件的Tab 键顺序有关,默认的 Tab 键顺序基于构建小部件的顺序。因此,创建更多小部件会更改键盘焦点。这就是为什么你必须QWidget::setFocus最后打电话的原因。

我会考虑为您的主窗口使用一个子类QWidget来覆盖showEvent虚拟功能,然后将键盘焦点设置为lineEdit. 这将具有在lineEdit显示窗口时始终给予焦点的效果。

于 2009-02-09T16:40:20.077 回答
26

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

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

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

于 2009-03-07T23:08:12.233 回答
4

也许这是一个更新,因为最后一个答案是在 2012 年,而 OP 最后一次编辑这个问题是在 2014 年。他们让我工作的方式是改变政策,然后设定焦点。

line->setFocusPolicy(Qt::StrongFocus);
line->setFocus();
于 2016-09-10T19:39:45.527 回答
1

在 Qt setFocus() 是一个插槽中,您可以尝试其他采用 Qt::FocusReason 参数的重载方法,如下所示:

line->setFocus(Qt::OtherFocusReason);

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

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

于 2009-02-09T00:44:13.807 回答