[PyQt] pyqt4topyqt5 a helper for the conversion PyQt4 to PyQt5

Baz Walter bazwal at ftml.net
Mon Jul 22 19:46:38 BST 2013

On 22/07/13 09:33, Vincent Vande Vyvre wrote:
> Hi,
> pyqt4topyqt5 is a script intended to help to the conversion PyQt4 to PyQt5.
> The main fixes are the changes QtGui > QtWidgets, QtWebKit >
> QtWebKitWidget, QtGui > QtPrintSupport, refactor signal-slot old style
> in new style, change the method in QFileDialog, QWheelEvent and QLayout.
> See the README for an exhaustive list of fixes
> So, this script was written for my own needs, feel free to send me yours
> observations.

Thanks for posting this. I had thought of doing something similar 
myself, but didn't find the time.

I haven't really tested your script much, but I found a couple of 
problems. The 'call_re' and 'slots_re' regexps only allow for 
double-quoted strings, so any single-quoted signals/slots will get the 
"Ambiguous syntax" message.

Also, your script needs to allow for overloads of signals with default 
arguments like "clicked(bool = 0)". This is a very common source of bugs 
when converting from old-style signals - there's even an example of it 
in your own README!:

     < self.connect(ui.right, SIGNAL("clicked()"), lambda angle=90: 
     > ui.right.clicked.connect(lambda angle=90: self.rotate(angle))

The old-style signal will pass no arguments to its handler, but the 
new-style signal will pass "False" by default (even if the button is not 
checkable). To avoid this issue, you must explicitly select the "no 
argument" overload with an empty tuple:

     ui.right.clicked[()].connect(lambda angle=90: self.rotate(angle))

I think there may be a few other signals that have similar issues 
(QAction.triggered is one that immediately springs to mind). The PyQt4 
class reference has details about the default overloads for new-style 
signals, e.g:


so you could try grepping that to find the others.

Baz Walter

More information about the PyQt mailing list