【问题标题】:FocusReason in PyQt5?PyQt5 中的焦点原因?
【发布时间】:2018-10-17 19:44:15
【问题描述】:

我注意到在调用 QtWidgets.setFocus 时,我在 PyCharm 中收到一条警告,说它需要 Qt.FocusReason 而不是布尔值。实际上,此方法的文档还指出它需要Qt.FocusReason。但是对于我的一生,我找不到任何有关 PyQt5 的信息。

myPlainTextEdit.setFocus(True)

通过传入一个布尔值,该方法工作得非常好,但我想知道这是否可能是 PyQt4 的一些遗留问题,或者只是一个异常情况?我注意到PyQt Sourceforge Documentation 上似乎是针对 PyQt4 的,上面写着要从QFocusEvent 获取FocusReason。在尝试这样做时,我收到了另一个警告; Expected type 'FocusReason', got 'Type' instead. 正如人们所料,这会引发 TypeError。

myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)

PyQt5 documentation 似乎不包含Qt.FocusReason 的页面。由于这是非常迂腐的,如果没有解决方案,我不会过分担心。我很想知道是什么原因造成的。是否可以首先将 Qt FocusReason 传递给QtWidgets.setFocus

【问题讨论】:

  • 在 python 中boolint 的子类,所以这里没有真正的神秘之处。从来没有出现过setFocus(bool) 过载。一直有setFocus()clearFocus(),然后在Qt4中添加了setFocus(Qt:FocusReason)

标签: python python-3.x pyqt pyqt5


【解决方案1】:

每个小部件都支持两个名为 setFocus() 的函数:

你指的是第一个。那么让我们来分析一下您指出的内容:

  • 通过传入一个布尔值,该方法工作得非常好

有效但不代表正确,首先Qt::FocusReason是一个枚举,也就是说每个属于的元素都关联一个数字:

Qt::MouseFocusReason          0   A mouse action occurred.
Qt::TabFocusReason            1   The Tab key was pressed.
Qt::BacktabFocusReason        2   A Backtab occurred. The input for this may include the Shift or Control keys; e.g. Shift+Tab.
Qt::ActiveWindowFocusReason   3   The window system made this window either active or inactive.
Qt::PopupFocusReason          4   The application opened/closed a pop-up that grabbed/released the keyboard focus.
Qt::ShortcutFocusReason       5   The user typed a labels buddy shortcut
Qt::MenuBarFocusReason        6   The menu bar took focus.
Qt::OtherFocusReason          7   Another reason, usually application-specific.

所以当传递一个布尔值时,它会将其转换为整数,False 为 0,True 为 1,所以 setFocus(True) 等于 setFocus(QtCore.Qt.TabFocusReason)

  • 在尝试这样做时,我收到了另一个警告;预期类型“FocusReason”,改为“类型”。正如人们所预料的那样,这会引发 TypeError。

    myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)
    

当您意识到QtGui.QFocusEvent.ActionAdded 不属于该列表时,它会引发错误。您必须使用上一个列表中的值,方法是将 :: 更改为 . 并在其前面加上 QtCore 前缀,因为它属于该子模块,例如:

myPlainTextEdit.setFocus(QtCore.Qt.MouseFocusReason)

加:

如果您只想确定小部件具有焦点,则应调用第二个函数:

myPlainTextEdit.setFocus()

为了干净使用clearFocus()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多