неизвестный синтаксис python (имя_функции [тип данных]) — требуется дополнительная информация

#python #syntax #pyqt5

#python #синтаксис #pyqt5

Вопрос:

Я ищу больше информации об этом виде синтаксиса

имя_функции [тип данных]

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

Я наткнулся на это, когда следовал руководствам PyQt5, в частности этому

http://zetcode.com/gui/pyqt5/widgets/

который содержит эту строку

 sld = QSlider(Qt.Horizontal, self)
...
sld.valueChanged[int].connect(...)
  

Из документации Qt5 я вижу, что это определение функции signal

 valueChanged(int value)
  

https://doc.qt.io/qt-5.11/qabstractslider.html#signals

Спасибо,

Комментарии:

1. Это старый добрый синтаксис индексирования, подобный тому, который вы использовали бы со списком или словарем; они только что определили __getitem__ для некоторых своих объектов, поэтому он выполняет что-то еще. Это особенность Qt.

2. Не путайте методы C с их эквивалентами на Python. valueChanged не является функцией в Python.

3. Смотрите документацию сигналам и слотам PyQt5

4. Я забыл упомянуть, что я знаю, что документы Qt находятся на C . Но на что-то можно ссылаться, просто используя тип данных?

5. Итак, из документации PyQt5 я думаю, что это было бы соответствующим утверждением? «Сигнал может быть проиндексирован с помощью подписи, чтобы выбрать необходимую. Подпись — это последовательность типов. Тип — это либо объект типа Python, либо строка, являющаяся именем типа C .» Это обычная практика?

Ответ №1:

При кодировании Qt на C вы можете подписаться на сигналы, используя слоты с разными сигнатурами, используя технику C , называемую перегрузкой метода. Qt вызовет правильный слот на основе типа аргумента измененного значения. В документации Qt по слотам в качестве примера используется перегруженное display() определение слота:

 public slots:
    void display(int num);
    void display(double num);
    void display(const QString amp;str);
    // ...
  

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

Python, с другой стороны, не имеет такой концепции. Python динамически типизируется, определения функций не включают информацию о типе.

Итак, оболочка PyQt вокруг QT позволяет вам определить, какой тип аргумента следует ожидать, используя в сигнале синтаксис подписки Python, тот же синтаксис, который вы использовали бы для обращения к индексам и фрагментам в списках или ключам в словарях. Используя это, вы можете подключить свой слот к определенному «варианту» сигнала. Сигналы в этом сценарии не являются методами, это пользовательские объекты-оболочки, которые вместо этого поддерживают подписку, и результатом этого signal[type] является более конкретный объект signal, к которому вы можете подключиться или отключиться, и слот будет вызываться только для этого конкретного типа.

Для вашего примера сигнал QAbstractSlider.valueChanged` поступает только в одном варианте, который выдает целое число:

 void    valueChanged(int value)
  

итак, в Python вы бы привязали этот вариант через valueChanged[int] . Если сигнал не принимает аргументов, вы можете использовать его signal напрямую, подписка не требуется; например sliderPressed . Фактически, вы можете использовать любой сигнал таким образом, но тогда выбирается значение по умолчанию, если есть несколько перегрузок; вы можете проверить .signal атрибут в этом случае, чтобы увидеть, какой из них будет использоваться.

Смотрите документациюсигналам и слотам в руководстве PyQt5:

Связанный сигнал имеет connect() , disconnect() и emit() методы, которые реализуют связанную функциональность. У него также есть signal атрибут, который является сигнатурой сигнала, который будет возвращен SIGNAL() макрокомандой Qt.

Сигнал может быть перегружен, т.Е. сигнал с определенным именем может поддерживать более одной подписи. Сигнал может быть проиндексирован с помощью подписи, чтобы выбрать необходимую. […]

Если сигнал перегружен, то у него будет значение по умолчанию, которое будет использоваться, если индекс не указан.