我注意到在调用QtWidgets.setFocus
时,我在PyCharm中收到一条警告,说它期望使用Qt.FocusReason
而不是布尔值。确实,此方法的文档还指出它采用Qt.FocusReason
。但是对于我的一生,我找不到有关PyQt5的任何信息。
myPlainTextEdit.setFocus(True)
通过传入布尔值,该方法可以很好地工作,但是我想知道这是否是PyQt4的某些遗留物,还是只是异常?我注意到在PyQt Sourceforge Documentation上,这似乎是针对PyQt4的,它说是从
FocusReason
获取QFocusEvent
的。尝试执行此操作时,我再次收到警告。 Expected type 'FocusReason', got 'Type' instead.
可能会引发TypeError异常。myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)
PyQt5 documentation似乎没有包含
Qt.FocusReason
的页面。由于这是非常令人讨厌的事情,如果没有解决方案,我不会太担心。我有兴趣知道是什么原因造成的。首先可以将Qt FocusReason传递给QtWidgets.setFocus
吗? 最佳答案
每个小部件都支持2个称为setFocus()
的函数:void QWidget::setFocus(Qt::FocusReason reason)
void QWidget::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()
。关于python - PyQt5中的FocusReason?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52862504/