我注意到,在调用 QtWidgets.setFocus
时,我在 PyCharm 中收到一条警告,指出它需要 Qt.FocusReason
而不是 bool 值。事实上,该方法的文档还指出它需要一个Qt.FocusReason
。但我怎么也找不到 PyQt5 的任何相关信息。
myPlainTextEdit.setFocus(True)
通过传递 bool 值,该方法工作得非常好,但我想知道这是否可能是 PyQt4 的一些遗留问题,或者只是一个异常现象?我注意到PyQt Sourceforge Documentation ,这似乎适用于 PyQt4,它说从 QFocusEvent
获取 FocusReason
。在尝试这样做时,我收到另一个警告; 预期类型为“FocusReason”,却得到了“Type”。
正如人们所预料的那样,这会引发 TypeError。
myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)
PyQt5 documentation似乎不包含 Qt.FocusReason
的页面。由于这是非常迂腐的,所以我并不太担心是否没有解决方案。我有兴趣知道是什么原因造成的。是否可以首先将 Qt FocusReason 传递给 QtWidgets.setFocus
?
最佳答案
有 2 个函数名为 setFocus()
每个小部件都支持:
你指的是第一个。那么让我们分析一下您指出的内容:
- 通过传入 bool 值,该方法工作得非常好
它有效,但并不意味着它是正确的,首先 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.
因此,当传递 bool 值时,它会将其转换为整数,False 转换为 0,True 转换为 1,因此 setFocus(True)
等于 setFocus(QtCore.Qt.TabFocusReason)
.
在尝试执行此操作时,我收到另一个警告;预期类型为“FocusReason”,但得到的是“Type”。正如人们所料,这会引发 TypeError。
myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)
如您所知QtGui.QFocusEvent.ActionAdded
不属于该列表,因此会抛出错误。您必须通过更改 ::
来使用上一个列表中的值。通过.
并添加前缀 QtCore
因为它属于该子模块,例如:
myPlainTextEdit.setFocus(QtCore.Qt.MouseFocusReason)
加号:
如果您只想确定小部件具有焦点,您应该调用第二个函数:
myPlainTextEdit.setFocus()
为了清洁使用 clearFocus()
.
关于python - PyQt5 中的 FocusReason?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52862504/