【问题标题】:Automatic focus on showing deletes the placeholder text of a QLineEdit自动聚焦显示删除 QLineEdit 的占位符文本
【发布时间】:2014-12-19 22:25:31
【问题描述】:

我使用 PyQt4 和 Python 2.7.9。

我的程序包含一些QLineEdit 对象。问题是当程序启动时,QLineEdits 之一被自动聚焦,这导致我的占位符文本消失。

有什么办法阻止它,或者至少不要让它隐藏占位符文本?

【问题讨论】:

    标签: python qt pyqt focus qlineedit


    【解决方案1】:

    另一种方法是

    self.this_widget.clearFocus()
    

    窗口显示后。只有在 Qt5 中,即使有焦点也会显示占位符文本。所以也许切换到 PyQt5。

    【讨论】:

    • 加一个 clearFocus 和 Qt5 中不同的焦点行为。但是,我不明白您为什么认为 text() 应该返回占位符文本:它在 Qt-5.4 中没有这样做,如果这样做,那将是一个令人讨厌的错误。但无论如何,在极少数情况下您可能想要这种行为,您可以轻松地做到text = widget.text() or widget.placeholderText()
    • @ekhumoro 感谢您的评论。我认为我在 text() 的行为上犯了一个错误。这是我记得的,但显然是错误的。我更想要这种行为,因为我喜欢占位符作为默认形式,而您的 text() or placeholderText() 优雅地解决了它。你的 Qt 知识真的很棒。在过去的几天里,我不得不经常投票。 ;)
    • 顺便说一句,不幸的是,Qt5 即使有焦点也会保留占位符文本。我在过去几年看到的每条 UI 设计指南都清楚地表明,在焦点上,提示应该消失,很容易认为框中有值,或者框是只读的。
    • @Schollii 很好的观察。这里的问题是一个组件会自动聚焦。因此,真正的解决方案可能是当小部件可见时,Qt 中没有任何组件被聚焦。应该可以在没有输入焦点的情况下显示并将某些内容带到前台。
    • 我昨天正在研究解决这个问题,不幸的是我的代码将在 Qt5 不可用的环境中运行(Houdini、Nuke 等)。我最终继承了 QLineEdit,覆盖了 paintEvent 方法并基于 C++ 源代码 (code.metager.de/source/xref/lib/qt/src/gui/widgets/…) 重新实现了占位符渲染。这很简单,似乎可以成立。至于Qt5什么时候可用,我的代码直接使用QLineEdit。
    【解决方案2】:

    您可以使用setFocus 将焦点放在不同的小部件上(不过,根据您选择的小部件,您可能还需要先设置focus-policy):

        self.some_other_widget.setFocusPolicy(QtCore.Qt.TabFocus)
        self.some_other_widget.setFocus()
    

    或者,如果您使用 Qt Designer 创建 GUI,您可以 edit the tab-order 以便行编辑不是链中的第一个。这也可以使用QWidget.setTabOrder 以编程方式完成。

    【讨论】:

    • 谢谢!我使用 Qt Designer 创建了 GUI,因此我更改了 Tab 键顺序,它按预期工作。
    猜你喜欢
    • 2012-12-29
    • 2015-08-15
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多