「Differences Between PyQt4 and PyQt5」の抄訳

PyQt使ってみたかったけど、ver.4とver.5で違いが結構あるぽいので Differences Between PyQt4 and PyQt5 — PyQt 5.2.1 Reference Guide を抄訳してみた。

なにか変なところがあったら教えてくだちい。


PyQt4とPyQt5の違い

PyQt5とPyQt4は、互換性がありません(が、PyQt4からPyQt5へのアプリケーションの移植は難しいことではないと言えます)。 このセクションでは、PyQt5とPyQt4の間の主要な違いについて説明します。

サポートするPythonのバージョン

Python2.6より古いバージョンはサポートしません。

廃止予定の機能

PyQt5では、deprecatedになった又はQt v5.0で廃止したAPIについてはサポートしません。 しかし、いくつかのAPIをうっかり含んでしまうかもしれません。 それらはバグなので、見つけ次第直していきます。

複数のAPI

PyQt4では複数バージョンのAPIをサポートしています(例えば、QString, QVariantなど )。 PyQt5ではQVariantを除いて、全てのAPIはv2のみが実装しています。 QVariantの変更と、QPyNullVariantについては、 Support for QVariant — PyQt 5.2.1 Reference Guide を参考にしてください。

古いスタイルのシグナルとスロット

PyQt4での古いスタイルのシグナルとスロットはサポートしません。 そのため、次のメソッドPyQt5では実装していません。

  • QObject.connect()
  • QObject.emit()
  • SIGNAL()
  • SLOT()

SIGNAL()SLOT()の返り値を引数としてつかうメソッドは、全てサポートしません。 シグナルか、それぞれ呼ばれるメソッドは常に同等なものとして、違いがなくなります。

加えて、次のメソッドは違いが発生します。

  • disconnect()は、引数を取らず全てのQObjectインスタンスから切断します。

新しいスタイルのシグナルとスロット

Qtは2つの異なる引数を持つシグナルを実装しています、1つは引数を使うもので、もうひとつは引数を使わないものです。 PyQt4では、好きな方を選んで使うことができました。 しかしながら、シグナルを発するときに、あなたは適切な引数を持つシグナルを使う必要がありました。

PyQt5では、全ての引数が指定されたシグナルのみを使うことができます。 しかし、シグナルを発するときに不要な引数は省略することができます。

PyQt4とは違って、PyQt5ではプロパティでの定義をサポートしており、シグナルとスロットはQObjectのサブクラスではなくなりました。

QtDeclarative、QtScript、QtScriptToolsモジュール

PyQt4のQtDeclarativeQtScriptQtScriptToolsモジュールはサポートしません。 PyQt5では、これらはQtQmlQtQuickモジュールに置き換えました。 PyQt4と違って、PyQt5ではQMLからPythonオブジェクトの生成をサポートします。

QtGuiモジュール

PyQt4のQtGuiモジュールは、PyQt5ではQtGuiQtPrintSupportQtWidgetsモジュールに分割しました。

QtOpenGLモジュール

PyQt5では、QGLContextQGLFormatQGLWidgetクラスのみをサポートします。

QtWebkitモジュール

PyQt4のQtWebKitモジュールは、PyQt5ではQtWebKitQtWebKitWidgetsモジュールに分割しました。

QtXmlモジュール

PyQt4のQtXmlモジュールはサポートしません。 QXMLStreamReaderクラスかQXMLStreamWriterクラスか、Pythonの標準XMLモジュールを使ってください。

pyqtconfigモジュール

PyQt4のpyqtconfigモジュールはサポートしません。 この The PyQt5 Extension API — PyQt 5.2.1 Reference Guide で、PyQt5でのサードパーティのパッケージ(例:QScintilla)についてを説明しています。

dbus.mainloop.qtモジュール

PyQt4のdbus.mainloop.qtモジュールは、PyQt5ではdbus.mainloop.pyqt5になりました。 これは、並べて実行することも許可し、どちらも同じ機能になります。

QDataStream

readUInt8()readInt8()writeUInt8()writeInt8()メソッドは、全て数値の読み書きとして解釈されます。 PyQt4では、これらは1つの文字について解釈されていました。

QFileDialog

PyQt4のQFileDialogに属するgetOpenFileNameAndFilter()getOpenFileNamesAndFilter()getSaveFileNameAndFilter()メソッドは、PyQt5ではgetOpenFileName()getOpenFileNames()getSaveFileName()に改名しました。PyQt4のgetOpenFileName()getOpenFileNames()getSaveFileName()はPyQt5ではサポートしません。

QGraphicsItemAnimation

廃止予定だったQGraphicsItemAnimationクラスは削除しました。 もし、移植したいPyQt4アプリケーションで使用していた場合は、QPropertyAnimationをかわりに使うことを検討してみてください。

QMatrix

廃止予定だったQMatrixクラスは削除しました。 もし、移植したいPyQt4アプリケーションで使用していた場合は、QTransformをかわりに使うことを検討してみてください。

QPyTextObject

PyQt4はQPyTextObjectを複数のQtのクラスからサブクラス化されたPythonクラスを定義することができないことの回避策として使用しています。 PyQt5はQ_DECLARE_INTERFACEのようにC+ +で宣言されている、インタフェースがあるものであれば、複数のQtのクラスからサブクラスであるPythonのクラスを定義する機能をサポートしています。 したがってQPyTextObjectはPyQt5に実装されていません。

QSet

PyQt4では、QSetPython v2ではリストとして、Python v3ではセットとして実装していました。 PyQt5では、常にセットとして実装しています。

pyuic5

pyuic5は、pyuic4--pyqt3-wrapperフラグをサポートしません。

pyrcc5

pyrcc5pyrcc4-py2-py3フラグをサポートしません。 pyrcc5の出力は、Python v2.6以降の全てのバージョンに互換性があるものになります。

Cooperative Multi-inheritance

Releasing the GIL

Object Destruction on Exit


時間無くなっちゃった(・ω<)