#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.Сигнал может быть перегружен, т.Е. сигнал с определенным именем может поддерживать более одной подписи. Сигнал может быть проиндексирован с помощью подписи, чтобы выбрать необходимую. […]
Если сигнал перегружен, то у него будет значение по умолчанию, которое будет использоваться, если индекс не указан.