【问题标题】:Set QLineEdit focus in Qt在 Qt 中设置 QLineEdit 焦点
【发布时间】:2010-10-06 07:41:29
【问题描述】:

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

【问题讨论】:

    标签: c++ qt qlineedit


    【解决方案1】:

    Keyboard focus 与小部件tab order 相关,默认的 Tab 键顺序基于小部件的构建顺序。因此,创建更多小部件会更改键盘焦点。这就是为什么您必须最后拨打QWidget::setFocus 的原因。

    我会考虑为您的主窗口使用QWidget 的子类,它会覆盖showEvent 虚函数,然后将键盘焦点设置为lineEdit。这将产生在显示窗口时始终给予lineEdit 焦点的效果。

    【讨论】:

    • 一点更正:tab 顺序不是子级构造的顺序,而是它们添加到父级的顺序.
    • 这可能是真的,但我是在解释 Qt 文档 taht 状态:“您可以使用 QWidget::setTabOrder() 自定义 Tab 键顺序。(如果您不这样做,Tab 通常会将焦点移到小部件构造的顺序。)”
    【解决方案2】:

    另一个可行的技巧是使用singleshot 计时器:

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

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

    【讨论】:

    • 这就像魅力一样,事件系统是免费的,增加了在 mycase 中正确聚焦新(动态)创建的 lineedit 的优势。谢谢
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在 Qt setFocus() 是一个槽,你可以尝试其他重载方法,它需要一个 Qt::FocusReason 参数,如下所示:

      line->setFocus(Qt::OtherFocusReason);
      

      您可以在以下链接中了解焦点原因选项:

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

      【讨论】:

      • 嗨,米洛特。感谢您的回答。问题是,即使我更改为您写的内容,它也不起作用。由于它是一个小部件插槽,我假设我可以在应用程序启动时将信号连接到它。你知道那是什么信号吗?再次感谢。
      • 可以是任何信号,只要它的签名与槽的信号匹配,所以它可以连接到一个不带任何参数的信号。
      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多