我注意到在调用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/

10-12 18:18