Differences Between PySide and PyQt
Differences_Between_PySide_and_PyQt | Qt Wiki | Qt Developer Network
Differences Between PySide and PyQt
API differences
Different import name (PySide instead of PyQt4)
PySide uses a different library name than PyQt. Instead of typing:or
- from PyQt4. QtCore import *
you have to do the following:
- import PyQt4. QtCore
or
- from PySide. QtCore import *
.
- import PySide. QtCore
PySide only supports PyQt’s “API 2” (PSEP 101)
PyQt provides two different APIs [riverbankcomputing.co.uk], the first of which provides,
QStrings
QVariants
, etc as is in Python. The new API 2 provides automatic conversion between the Qt classes and respective native Python datatypes and is much more Pythonic in nature. PyQt on Python 2.x defaults to API 1, while PyQt on Python 3 defaults to API 2.
PySide only supports PyQt’s API 2 (see PSEP 101 [pyside.org]) for details. Therefore Qt classes such as
,
QStrings
, and
QStringLists
QVariants
are not available on PySide. Instead, you should simply use native Python datatypes.
If you’re porting code from PyQt, you might want to first modify the PyQt code to use API 2 (using a
sip.setapi(class,ver)
call before importing PyQt4), and only after getting that change working, change the imports to use PySide instead.
NB: Due to the API change,
returns a tuple in PySide, which often is an issue when porting code from PyQt. See e.g. bug 343 [bugs.openbossa.org].
QFileDialog.getOpenFileName
New-style signals and slots use slightly different syntax (PSEP 100)
PyQt unfortunately uses an implementation-specific naming scheme for its new-style signal and slot classes:As described in PSEP 100 [pyside.org], use
- # Define a new signal called 'trigger' that has no arguments.
- trigger = QtCore. pyqtSignal ( )
and
QtCore.Signal()
QtCore.Slot()
instead.
If you want to modify your PyQt code to use the PySide naming scheme, that can be done using a simple definition:
.
- QtCore. Signal = QtCore. pyqtSignal
- QtCore. Slot = QtCore. pyqtSlot
Declaring Qt Properties is done using a slightly different syntax (PSEP 103)
As with the signal/slot syntax change above, declaring Qt Properties is done using. Property instead of
QtCore
(see PSEP 103 [pyside.org]).
QtCore.pyqtProperty
Tool names different
PySide uses different names for the tools scripts:
- pyuic4 -> pyside-uic
- pyrcc4 -> pyside-rcc4
- pylupdate4 -> pyside-lupdate
Property Names
PySide usesand
connect
in the
event
. Do not use these for anything in your code, and when moving code from PyQt look for any that exist.
QObject
QThreads
In PySide you shouldon a thread after calling
.wait()
if you are quitting the application. Otherwise you may receive
.stop()
QThread: Destroyed while thread is still running Segmentation fault
Differences in the functionality of the bindings
Bindings for functions deprecated before Qt 4.5 are not generated
Bindings for functions deprecated before Qt 4.5 are not generated in PySide.
If a function is not present in PySide, check the Qt Online Reference Documentation [doc.qt.nokia.com] and see whether the function has been deprecated and what to use instead.
Example bug: bug 359 [bugs.openbossa.org]
For example, this affects functions such as
and
QColor.dark()
, instead of which
QColor.light()
and
QColor.darker()
need to be used.
QColor.lighter()
sender() method returns None when used within a partial or a lambda
If a lambda is used as a slot,cannot be used to acquire the object that emitted the signal. This works in PyQt, but their implementation behaves incorrectly in certain situations. See bug 344 [bugs.openbossa.org] for details.
sender()
When inheriting classes, parent class constructors need to be always called
PyQt in some cases allows code such as:in which the direct parent class constructor is not called. PySide expects you to do the right thing:
- class Window ( QtGui. QWidget ) :
- def __init__ (self , parent =None ) :
- super ( QtGui. QWidget , self ).__init__ (parent )
- [... ]
- class Window ( QtGui. QWidget ) :
- def __init__ (self , parent =None ) :
- super (Window , self ).__init__ (parent )
- [... ]
Old style signals need use of parentheses
PyQt allows the use of short-circuit signals without parentheses such as:Since this is an old and deprecated feature, and the effort to fix this is not worth it, we decided to not implement it. In PySide code you need to use something like:
- self. emit (SIGNAL ( 'text_changed_cb' ) , text )
You can check the complete discussion on bug #314 [bugs.pyside.org]
- self. emit (SIGNAL ( 'text_changed_cb(QString)' ) , text )
Only signals without arguments can be auto connected on constructor.
If you use:The triggered() signal will be connected to the slot handler instead of the triggered(bool) signal.
- action = QtGui. QAction (None , triggered =handler )
Supporting Both APIs
qt_compat.py [github.com] is an example of centralizing the knowledge of PySide and PyQt without using monkey-patching. It serves both to point out what differences exist as well as keeping your code binding-agnostic. This is important for when needing to support both bindings, usually when transitioning from one to the other and needing to continue to support older distributions that do not yet come with PySide.
QtBindingHelper.py [kforge.ros.org] of the ROS [ros.org] package python_qt_binding is a more extensive example of how to keep your code agnostic of the actual Python-Qt binding used. It offers a very transparent abstraction, allowing you to write standard import lines like
Furthermore it provides a substitute loadUi function for simple loading of ui files. For usage examples see RosGui [kforge.ros.org]
- from QtCore import QObject
Categories:
- LanguageBindings
- PySide
posted on 2012-04-10 23:08 lexus 閱讀( ...) 評論( ...) 編輯 收藏
轉載于:https://www.cnblogs.com/lexus/archive/2012/04/10/2441505.html