Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 Как в PyQt работать с указателями?  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Фреймоворк Qt изначально создавался для С++ и потому изобилует указателями (как в виде параметров метода, так и в виде возвращаемых значений). Но в Python нет никаких указателей, поэтому непонятно как писать код при использовании библиотеки PyQt.

Например в С++ я так получал иконку:
Information  = QIcon(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation));


А в Python я пробую это сделать так:
from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QStyle

Information = QtGui.QIcon(QApplication.style().standardIcon(QStyle.SP_MessageBoxInformation))


, но получаю ошибку (как раз в том месте, где в С++ я обращался к методу указателя!):
Information = QtGui.QIcon(QApplication.style().standardIcon(QStyle.SP_MessageBoxInformation))
AttributeError: 'NoneType' object has no attribute 'standardIcon'

Наверное есть какое- то общее правило работы с указателями, по которому была составлена библиотека PyQt. И почему- то я нигде его не нашел...
6 фев 19, 15:36    [21802803]     Ответить | Цитировать Сообщить модератору
 Re: Как в PyQt работать с указателями?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 3544
AlekseySQL
Наверное есть какое- то общее правило работы с указателями, по которому была составлена библиотека PyQt. И почему- то я нигде его не нашел...

Опять 25.
В плюсовом коде, при обращении к nullptr'у, который вернул бы QApplication::style() ты бы получил крэш.
В питоновом это обёрнуто дополнительными врапперами, и если метод возвращает None, значит, плюсовый статик метод QApplication::style() вернул nullptr.
/thread
6 фев 19, 16:17    [21802841]     Ответить | Цитировать Сообщить модератору
 Re: Как в PyQt работать с указателями?  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
NekZ
AlekseySQL
Наверное есть какое- то общее правило работы с указателями, по которому была составлена библиотека PyQt. И почему- то я нигде его не нашел...

Опять 25.
В плюсовом коде, при обращении к nullptr'у, который вернул бы QApplication::style() ты бы получил крэш.
В питоновом это обёрнуто дополнительными врапперами, и если метод возвращает None, значит, плюсовый статик метод QApplication::style() вернул nullptr.
/thread


Спасибо, у меня раньше не было таких ошибок, поэтому я решил, что указатель не смог корректно отобразиться в объект Python и получил значение None.

И все - таки по теме: у меня есть догадка, что все указатели заменяются ссылками. Верно?
6 фев 19, 16:49    [21802888]     Ответить | Цитировать Сообщить модератору
 Re: Как в PyQt работать с указателями?  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Я слегка глюканул и не разглядел, что в коде С++ идет обращение к синглтону:
QApplication::style()


Поэтому переделал так:
IconsOfMessages = {}
IconsOfMessages['Information'] = QtWidgets.QApplication.instance().style().standardIcon(QStyle.SP_MessageBoxInformation)
IconsOfMessages['Warning'] = QtWidgets.QApplication.instance().style().standardIcon(QStyle.SP_MessageBoxWarning)
IconsOfMessages['Critical'] = QtWidgets.QApplication.instance().style().standardIcon(QStyle.SP_MessageBoxCritical)


Но так как я обращаюсь к инстансу QApplication, то этот код работает только после выполнения main (где создается инстанс) и потому может быть только в экземплярах объектов (нельзя, например, создать перечисление с картинками). Сейчас я при создании экземпляра события, для которого нужны эти иконки, анализирую заполненность коллекции с иконами (хранящейся как атрибут этого класса) и если это первое обращение, то заполняю ее.

А есть какой- то более симпатичный способ получить заполненную коллекцию без постоянных проверок?
6 фев 19, 17:58    [21802958]     Ответить | Цитировать Сообщить модератору
 Re: Как в PyQt работать с указателями?  [new]
AlekseySQL
Member [заблокирован]

Откуда:
Сообщений: 952
Всем спасибо!

Принял решение явно все прописать при создании главного окна (когда экземпляр уже QAplication создан), чтобы все был понятно без всякой магии. Теперь человек, читающий код, увидит, что при начале работы программы создаются общие объекты (а не где- то глубоко расположены какие- то кульбиты).
7 фев 19, 08:02    [21803194]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить