2009-02-09 1884 views
14

我有一个QT问题。我希望QLineEdit小部件在应用程序启动时具有焦点。看看下面的代码,例如:在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启动?

回答

21

Keyboard focus是对窗口小部件相关tab order,默认选项卡顺序是基于在该小部件被构造的顺序。因此,创建更多小部件会改变键盘焦点。这就是为什么你必须使QWidget :: setFocus最后一次调用。

我会考虑在您的主窗口中使用QWidget的子类,它将覆盖虚拟函数showEvent,然后将键盘焦点设置为行编辑。这会在显示窗口时始终显示行编辑焦点。

+2

小改正:标签顺序不是孩子被_constructed_的顺序,而是它们被添加到父项的顺序。 – 2009-07-25 19:41:38

1

在Qt的setFocus()是一个槽,则可以尝试其它重载的方法,这需要的Qt :: FocusReason参数如线如下:

line->setFocus(Qt::OtherFocusReason); 

可以读取关于在以下的焦点原因选项链接:

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

+0

嗨米洛。感谢您的回答。即使我改变了你写的内容,它也行不通。由于它是一个小部件插槽,我假设我可以在应用程序启动时将信号连接到它。你知道那个信号是什么吗?再次感谢。 – hyperboreean 2009-02-09 00:56:47

+0

它可以是它的签名与信号槽相匹配的任何信号,所以它可以连接到一个没有任何参数的信号。 – milot 2009-02-09 09:02:16

21

可能工作另一个技巧是使用singleshot定时器:

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

实际上,这调用QLineEdit的实例的setFocus()槽之后的事件系统是“免费”这样做,即在部件完全构建后的某个时候。

1

也许这是一个更新,因为最后一个答案是在2012年,并且OP最后在2014年编辑了这个问题。他们的方式是我改变了策略,然后设置了重点。

line->setFocusPolicy(Qt::StrongFocus); 
line->setFocus();