Несовместимость между Python 3.2 и Qt? - PullRequest
2 голосов
/ 29 ноября 2011

У меня проблемы с Python 3.2 и PyQt 4.8.6 Кажется, что Python 3.2 не может найти импорт.Особенно "Q" -методы.Например, строка QString ниже.

from PyQt4 import QtCore, QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

С Python 2.7 все работает нормально.Где ошибка в моем коде?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Python3 внес много несовместимых изменений, чтобы «очистить» язык, и, в некоторой степени, PyQt сделал то же самое, представив «более pythonic» версии некоторых API.Но эти разные версии API могут быть выбраны в зависимости от класса для Python2 и Python3, поэтому единственное реальное отличие - это значения по умолчанию, выбранные для каждой версии Python.

В Python2версия API по умолчанию для QString - "v1", которая реализует его как тип Python;в Python3 по умолчанию используется значение «v2», которое автоматически преобразуется в соответствующий строковый объект Python и обратно из него.

Версию API можно выбрать с помощью функции setapi из пакета sip.Поэтому, чтобы продолжить использование класса QString в вашем приложении, просто убедитесь, что соответствующая версия установлена ​​перед первым импортом модулей PyQt:

import sip
sip.setapi('QString', 1)

from PyQt4 import QtCore, QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

Для получения подробной информации обо всех API, которые могут быть установлены таким образомсм. здесь .

2 голосов
/ 29 ноября 2011

Посмотрите заметки о Python 3 в Справочном руководстве PyQt .

Класс QString реализован как отображенный тип, который автоматически конвертируется в и из строки Python. Кроме того Ни один из них не преобразуется в нулевую строку QString. Тем не менее, нулевая строка QString преобразован в пустую строку Python (а не None). (Это потому что Qt часто возвращает нулевое значение QString, когда оно, вероятно, должно возвращать пустая строка QString.)

Я еще не перенес никакого кода в Python 3, но я считаю, что идея состоит в том, чтобы использовать обычные строки Python вместо QStrings. PyQt примет их, и они уже поддерживают Unicode в Python 3. Если обычно функция PyQt возвращает QString, она возвращает обычную строку Python в Python 3.

Посмотрите и другие различия на связанной странице.

...