Skip to content

Code completion inserts references to PySide2 #400

@chadrik

Description

@chadrik

Hi @mottosso!
A Qt.py user reported this to me, and luckily I can take care of the problem on my own, but I need your input.

Here's a quick refresher.

In #371 we decided to add simple .pyi files to the Qt.py distribution that redirect to PySide2 stubs, and we added install_requires=["types-PySide2"]. We arrived at this design for a few reasons:

  1. users get code completion without needing to install something separate, since most users will want completion, but they won't be educated on how to get it
  2. redirecting to PySide2 means that users can replacetypes-PySide2 -- which is installed by default with Qt.py -- with alternate PySide2 stubs of their choosing, and Qt.py will use those, by virtue of the redirect.

Problem

A downside of this approach has been pointed out to me. IDEs (correctly) infer that the owner of the Qt objects is PySide2, so they will often generates code for users that refer to PySide2 objects. For example, when overriding a method, it produces this result for the argument type of showEvent:

from Qt import QtWidgets, QtGui

class TestWidget(QtWidgets.QWidget):
    def showEvent(self, event: PySide2.QtGui.QShowEvent) -> None:
        ...

Expectation

What we want is the following:

from Qt import QtWidgets, QtGui

class TestWidget(QtWidgets.QWidget):
    def showEvent(self, event: QtGui.QShowEvent) -> None:
        ...

(Depending on the IDE, it may add Qt.QtGui.QShowEvent)

Solution

The only fool-proof solution that I know of that should work for all IDEs that understand pyi files is to create stubs explicitly for Qt.py, which would be a copy of types-PySide2 with all references to PySide2 replaced with Qt. This would be extremely easy for me to do as part of my https://github.com/chadrik/cg-stubs project. With your permission I would publish these to pypi as types-Qt, and I would add a PR here to replace install_requires=["types-PySide2"] with install_requires=["types-Qt"].

The primary downside that I see is that we lose benefit 2, above. A future challenge will be how to deal with PySide6 support (#367) as it pertains to the stubs, but the suggested plan does not make that situation any worse, in fact having custom-generated Qt stubs gives us more flexibility.

For the record, this relates to the long-standing issue #199

Let me know what you think.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions