FocusReason в PyQt5? - PullRequest
       8

FocusReason в PyQt5?

0 голосов
/ 17 октября 2018

Я заметил, что при вызове QtWidgets.setFocus в PyCharm я получаю предупреждение о том, что он ожидает Qt.FocusReason, а не логическое значение.Действительно, документация для этого метода также утверждает, что он занимает Qt.FocusReason.Но что касается меня, я не могу найти никакой информации об этом для PyQt5.

myPlainTextEdit.setFocus(True)

Этот метод прекрасно работает, передавая логическое значение, но мне интересно, возможно, это какое-то наследиеиз PyQt4 или просто аномалия?Я заметил, что в документации PyQt Sourceforge , которая, кажется, предназначена для PyQt4, говорится, что она получает FocusReason из QFocusEvent.В попытке сделать это, я получаю еще одно предупреждение;Expected type 'FocusReason', got 'Type' instead. Это вызывает ошибку TypeError, как и следовало ожидать.

myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)

Документация PyQt5 не содержит страницы для Qt.FocusReason.Поскольку это крайне педантично, я не слишком обеспокоен, если нет решения.Мне интересно знать, что вызывает это.Можно ли передать Qt FocusReason в QtWidgets.setFocus в первую очередь?

1 Ответ

0 голосов
/ 17 октября 2018

Есть 2 функции с именем 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», вместо него получено «Type».Это вызывает ошибку TypeError, как и следовало ожидать.

    myPlainTextEdit.setFocus(QtGui.QFocusEvent.ActionAdded)
    

Как вы понимаете, QtGui.QFocusEvent.ActionAdded не принадлежит этому списку, поэтому выдает ошибку.Вы должны использовать значения из предыдущего списка, изменив :: на . и добавив к нему префикс QtCore, поскольку он принадлежит этому подмодулю, например:

myPlainTextEdit.setFocus(QtCore.Qt.MouseFocusReason)

Plus:

Если вы просто хотите установить, что виджет имеет фокус, вы должны вызвать вторую функцию:

myPlainTextEdit.setFocus()

И для чистого использования clearFocus().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...