Автозаполнение от .ui - PullRequest
       13

Автозаполнение от .ui

2 голосов
/ 08 ноября 2019

Я работаю над приложением, использующим Python3 и PyQt5, с моим макетом пользовательского интерфейса, определенным в файле Qt .ui и загруженным в мой класс QDialog во время выполнения. Поэтому экземпляры моих элементов пользовательского интерфейса, такие как QPushButton, автоматически назначаются в качестве переменных экземпляра моего класса QDialog при загрузке пользовательского интерфейса.

Проблема в том, что, когда я иду использовать эти переменныечтобы изменить элементы, я не получаю никаких подсказок типа Intellisense или автозаполнения, потому что Python и моя IDE не имеют ни малейшего представления о том, что такое класс объекта.

В Java вы можете использовать явное сужение приведения к вашему объекту. к правильному типу, с этого момента intellisense может начать предоставлять автозаполнение, поскольку он знает тип.

Например, в Java и Android SDK:

TextView name = (TextView) findViewById(R.id.name); 

В этом примере findViewByIdвозвращает представление, так что вы можете использовать приведение типов, чтобы убедиться, что оно приведено к TextView.


В Python я хотел бы сделать то же самое, оба для обеспечения того, чтобы пользовательский интерфейсэлементы, к которым я обращаюсь, имеют правильный тип и могут использовать автозаполнение для методов экземпляра.

Вот моя текущая ситуацияon:

""" 
Because Python doesn't know whether self.my_push_button is an instance 
of QPushButton, this may or may not work, but it won't know until runtime, 
so no autocompletion.
"""
self.my_push_button.setEnabled(False) 

То, что я хочу сделать, это что-то вроде этого:

( (QPushButton) self.my_push_button ).setEnabled(False) 

Я пробовал это:

QPushButton(self.my_push_button).setEnabled(False)

Но из того, что яМожно сказать, он дублирует исходный объект и выполняет setEnabled для нового объекта, что явно не то, что я хочу.

Я также пытался использовать операторы assert с функцией isinstance:

assert isinstance(self.my_push_button, QPushButton)

"""
This works for providing the code completion and checking the type.
However, it only works within the scope of the assert statement, so adding an assert for each variable in each scope in which it is used would be unnecessarily verbose.
"""
self.my_push_button.setEnabled(False) 

Я понимаю, что в Python нет реального "приведения" к объектам, но есть ли какой-нибудь способ иметь что-то похожее в Python на сужение приведения, как показано выше, в Java?

1 Ответ

1 голос
/ 08 ноября 2019

Завершение кода не работает для динамически генерируемых элементов, как это делает uic.

Одним из возможных решений является преобразование .ui в .py с использованием pyuic, а затем использовать тот класс, указанный в Использование сгенерированного кода .

...