PySide6 Migration Lint: PyQt5/PyQt6 Licence Gate

Flags PyQt5/PyQt6 imports (GPL v3 or a paid Riverbank licence) and the PyQt-only APIs that break under LGPL PySide6: pyqtSignal, pyqtSlot, uic.loadUi, QRegExp, exec_, sip. One fix per line. Runs entirely in your browser — nothing is uploaded.

Same engine as the VS Code extension, byte for byte.

Get the complete version $29

This page is the working piece. The full pack has everything below.

14 rules flag PyQt5/PyQt6 imports and the PyQt-only APIs that break under LGPL PySide6, one fix per line

Commercial PyQt licence from Riverbank Computing: 670 USD per developer (price page read 2026-09-29)

Buy the full version — $29
Want the full version?
Enter your email and we send the download link.
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

Migrate from PyQt5 to PySide6: 6 findings in one invoice window

6 findings in one 24-line PyQt5 invoice window: that is what a Python developer shipping a closed-source desktop app gets before moving from PyQt5 to PySide6. The import line, pyqtSignal, uic.loadUi, QRegExp, pyqtSlot and exec_() all have to change.

What changed, and when

PyQt5 and PyQt6 are dual-licensed by Riverbank Computing: GPL v3, or a commercial licence. Riverbank's price page (read 2026-09-29) lists the commercial licence at 670 USD per developer. If your app is closed source and you ship PyQt under the GPL, the GPL asks you to publish your source. PySide6, the Qt for Python binding from The Qt Company, is LGPL v3, which lets a closed-source app link to it dynamically.

The second clock is Qt itself. PyQt5 runs on Qt 5.15, and The Qt Company ended Qt 5.15 standard support on 2025-05-26; 5.15.19 was the last Qt 5.15 release. On 2026-09-29 that is 491 days without standard support.

Why find-and-replace fails

The obvious port is a search for "PyQt5" and a replace with "PySide6". It fixes the imports and nothing else. PySide6 has no pyqtSignal, pyqtSlot or pyqtProperty (it has Signal, Slot and Property). It has no uic module, so uic.loadUi needs QUiLoader or pyside6-uic. It has no QVariant. Qt 6 removed QRegExp, QDesktopWidget and QFontMetrics.width, and moved QAction from QtWidgets to QtGui. The file may import cleanly and then fail on the first signal connection, often on a path the tests never run.

What the lint does

PySide6 Migration Lint reads 2 inputs, the .py source text and today's date, and runs 14 rules. Each finding gives the line number and the PySide6 replacement. Comments are ignored, so a note like "# was: from PyQt5 import ..." stays quiet.

On the sample file, dirty.py, it reports:

The ported clean.py returns 0 findings. The PyQt5 import finding also carries the Qt 5.15 day count for the date you enter, so a file checked on 2025-03-01 says standard support ends in 86 days.

The 14 rules

pyqt5-import, pyqt6-import, pyqt-signal, pyqt-slot, pyqt-property, uic-loadui, sip-module, pyqt-version-const, qvariant, qregexp, qdesktopwidget, fontmetrics-width, qaction-qtwidgets and exec-underscore.

Free and full version

The free version checks one .py file at a time with all 14 rules, in VS Code or on the web page, with no key. The full version scans the whole workspace in one pass and exports a migration report per file for release or licence sign-off.

It does not rewrite code and it is not legal advice: it shows which lines still tie you to PyQt, so you can port them or keep paying for a commercial PyQt licence.

15 seconds — what it actually does

Questions people ask

What does PySide6 Migration Lint do?

It reads 2 inputs, the .py source text and today's date, and runs 14 rules that flag every PyQt5 or PyQt6 import and every PyQt-only API such as pyqtSignal, pyqtSlot, uic.loadUi, QRegExp, sip and exec_(). Each finding names the line and the PySide6 replacement. A sample PyQt5 invoice window returns 6 findings.

Who is PySide6 Migration Lint for?

Python developers and small software companies who ship a closed-source desktop application built on PyQt5 or PyQt6, and who want to move to LGPL PySide6 instead of paying for a commercial PyQt licence per developer. It also suits teams still on Qt 5.15, whose standard support ended on 2025-05-26.

Why not just find-and-replace PyQt5 with PySide6?

A text replace fixes the import lines only. Names like pyqtSignal, pyqtSlot, pyqtProperty, uic.loadUi, QVariant and QRegExp do not exist in PySide6, and QAction moved to QtGui in Qt 6. The file then fails at import time or on the first signal, often on a path your tests never run.

What is free and what needs a licence key?

Free, with no key: one .py file at a time, with both inputs (source text and date), all 14 rules, and a fix line for every finding, in VS Code or the free web version. The licence key adds the whole workspace in one pass and an exportable migration report per file for release or licence sign-off.

What does staying on PyQt cost instead?

Riverbank Computing lists its commercial PyQt licence at 670 USD per developer (price page read 2026-09-29), and a closed-source app that ships PyQt under the GPL v3 must publish its source. PySide6 is LGPL v3 from The Qt Company. This lint shows which lines still tie you to PyQt before you choose.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.