{"id":13648092,"url":"https://github.com/spyder-ide/qtpy","last_synced_at":"2026-10-19T16:47:47.727Z","repository":{"id":31400686,"uuid":"34963904","full_name":"spyder-ide/qtpy","owner":"spyder-ide","description":"Provides an uniform layer to support PyQt5, PySide2, PyQt6, PySide6 with a single codebase","archived":false,"fork":false,"pushed_at":"2026-04-12T05:22:34.000Z","size":1034,"stargazers_count":1106,"open_issues_count":42,"forks_count":166,"subscribers_count":30,"default_branch":"master","last_synced_at":"2026-10-11T22:23:50.810Z","etag":null,"topics":["closember","pyqt","pyqt6","pyside","pyside2","pyside6","python","qt-gui","qtpy","spyder"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spyder-ide.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"open_collective":"spyder"}},"created_at":"2015-05-02T21:28:22.000Z","updated_at":"2026-10-01T17:49:05.000Z","dependencies_parsed_at":"2023-02-17T13:31:24.438Z","dependency_job_id":"1446e829-6ee5-4cbf-8509-57e3d16ad7c7","html_url":"https://github.com/spyder-ide/qtpy","commit_stats":{"total_commits":867,"total_committers":72,"mean_commits":"12.041666666666666","dds":0.7681660899653979,"last_synced_commit":"0f7b181e45186b568551cf50078e5eeda05e3953"},"previous_names":[],"tags_count":40,"template":false,"template_full_name":null,"purl":"pkg:github/spyder-ide/qtpy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Fqtpy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Fqtpy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Fqtpy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Fqtpy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spyder-ide","download_url":"https://codeload.github.com/spyder-ide/qtpy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Fqtpy/sbom","scorecard":{"id":842909,"data":{"date":"2025-08-11","repo":{"name":"github.com/spyder-ide/qtpy","commit":"ad8d3453203c9046fc86a2b35195201a6ef3a921"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5,"checks":[{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Code-Review","score":6,"reason":"Found 8/13 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:123: update your workflow using https://app.stepsecurity.io/secureworkflow/spyder-ide/qtpy/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/spyder-ide/qtpy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/spyder-ide/qtpy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:136: update your workflow using https://app.stepsecurity.io/secureworkflow/spyder-ide/qtpy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:163: update your workflow using https://app.stepsecurity.io/secureworkflow/spyder-ide/qtpy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:176: update your workflow using https://app.stepsecurity.io/secureworkflow/spyder-ide/qtpy/ci.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:39","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:48","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:56","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:65","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:71","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:74","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:76","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:86","Warn: pipCommand not pinned by hash: .github/workflows/test.sh:87","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   9 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: 'stale review dismissal' is disabled on branch 'master'","Warn: required approving review count is 1 on branch 'master'","Warn: codeowners review is not required on branch 'master'","Warn: 'last push approval' is disabled on branch 'master'","Warn: 'up-to-date branches' is disabled on branch 'master'","Info: status check found to merge onto on branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T20:51:40.562Z","repository_id":31400686,"created_at":"2025-08-23T20:51:40.562Z","updated_at":"2025-08-23T20:51:40.562Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344872684,"owners_count":38362279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-19T02:00:06.414Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["closember","pyqt","pyqt6","pyside","pyside2","pyside6","python","qt-gui","qtpy","spyder"],"created_at":"2024-08-02T01:03:57.915Z","updated_at":"2026-10-19T16:47:47.721Z","avatar_url":"https://github.com/spyder-ide.png","language":"Python","funding_links":["https://opencollective.com/spyder","https://opencollective.com/spyder/"],"categories":["User Interaction","Python","Interaction","Bindings"],"sub_categories":["Graphical User Interface"],"readme":"# QtPy: Abstraction layer for PyQt5/PySide2/PyQt6/PySide6\n\n[![license](https://img.shields.io/pypi/l/qtpy.svg)](./LICENSE)\n[![pypi version](https://img.shields.io/pypi/v/qtpy.svg)](https://pypi.org/project/QtPy/)\n[![conda version](https://img.shields.io/conda/vn/conda-forge/qtpy.svg)](https://www.anaconda.com/download/)\n[![download count](https://img.shields.io/conda/dn/conda-forge/qtpy.svg)](https://www.anaconda.com/download/)\n[![OpenCollective Backers](https://opencollective.com/spyder/backers/badge.svg?color=blue)](#sponsors)\n[![Join the chat at https://gitter.im/spyder-ide/public](https://badges.gitter.im/spyder-ide/spyder.svg)](https://gitter.im/spyder-ide/public)\u003cbr\u003e\n[![PyPI status](https://img.shields.io/pypi/status/qtpy.svg)](https://github.com/spyder-ide/qtpy)\n[![Github build status](https://github.com/spyder-ide/qtpy/workflows/Tests/badge.svg)](https://github.com/spyder-ide/qtpy/actions)\n[![Coverage Status](https://coveralls.io/repos/github/spyder-ide/qtpy/badge.svg?branch=master)](https://coveralls.io/github/spyder-ide/qtpy?branch=master)\n\n*Copyright © 2009– The Spyder Development Team*\n\n\n## Description\n\n**QtPy** provides a uniform interface to support PyQt5, PySide2, PyQt6, and PySide6 through a single codebase.\nIt abstracts the differences between bindings and versions, allowing software to remain portable and easier to maintain.\n\nImport from `qtpy` instead of PySide/PyQt:\n\n```python\nfrom qtpy import QtCore, QtWidgets\n\napp = QtWidgets.QApplication()\nwidget = QtWidgets.QWidget()\nwidget.show()\napp.exec()\n```\n\n\n## Installation\n\n```shell\npip install qtpy\n```\n\nor\n\n```shell\nconda install qtpy\n```\n\n\n### Requirements\n\nThe installation requires one of the supported packages (PyQt5, PyQt6, PySide2, PySide6) as QtPy does not install any binding by itself.\nIf multiple of these libraries are found, PyQt5 is used by default.\nTo set a specific binding, see [Bindings](#Bindings).\n\n\n## Features\n\n* Supports multiple Qt bindings (PyQt5/6, PySide2/6) without requiring conditional imports or logic branching.\n* Detects and loads the available Qt binding automatically based on what is installed or already imported.\n* Normalizes the module structure to follow the Qt5 layout (`QtGui` / `QtWidgets`).\n* Simplifies the process of porting applications between Qt5 and Qt6 by handling API incompatibilities internally.\n* Enables incremental updates to project modules rather than requiring a full-scale rewrite when changing Qt providers.\n\n\n### Bindings\n\nTo set a specific binding, set the `QT_API` environment variable to one of the following values:\n\n| Value     | Binding |\n|-----------|---------|\n| `pyside6` | PySide6 |\n| `pyside2` | PySide2 |\n| `pyqt6`   | PyQt6   |\n| `pyqt5`   | PyQt5   |\n\nFor example, to use PyQt6:\n```python\nimport os\nos.environ['QT_API'] = 'pyqt6'\nfrom qtpy import QtCore, QtGui, QtWidgets\nprint(QtWidgets.QWidget)\n```\n\n\n### Module Aliases\n\nQtPy provides aliases following the Qt5 module layout:\n\n| PyQt5/6               | Alias             |\n|-----------------------|-------------------|\n| `QtCore.pyqtSignal`   | `QtCore.Signal`   |\n| `QtCore.pyqtSlot`     | `QtCore.Slot`     |\n| `QtCore.pyqtProperty` | `QtCore.Property` |\n\n* For PyQt6 enums, unscoped enum access was added by promoting the enums of the `QtCore`, `QtGui`, `QtTest` and `QtWidgets` modules.\n\n* Compatibility is added between the `QtGui` and `QtOpenGL` modules for the `QOpenGL*` classes.\n\nFor example:\n```python\nfrom qtpy import QtCore, QtWidgets\n\nclass Widget(QtWidgets.QWidget):\n    value_changed = QtCore.Signal(int)\n```\n\n\n### Module Constants\n\n| Constant              | Value                                                       |\n|-----------------------|-------------------------------------------------------------|\n| `QtCore.__version__`  | The current Qt version.                                     |\n| `qtpy.QT_VERSION`     | The current Qt version.                                     |\n| `qtpy.PYSIDE_VERSION` | The current binding version for PySide. `None` if not used. |\n| `qtpy.PYQT_VERSION`   | The current binding version for PyQt. `None` if not used.   |\n| `qtpy.API_NAME`       | The current selected binding.                               |\n| `qtpy.PYSIDE2`        | `True`/`False` if PySide2 is currently used.                |\n| `qtpy.PYSIDE6`        | `True`/`False` if PySide6 is currently used.                |\n| `qtpy.PYQT5`          | `True`/`False` if PyQt5 is currently used.                  |\n| `qtpy.PYQT6`          | `True`/`False` if PyQt6 is currently used.                  |\n| `qtpy.QT5`            | `True`/`False` if Qt5 is currently used.                    |\n| `qtpy.QT6`            | `True`/`False` if Qt6 is currently used.                    |\n\n\n### Compat Module\n\nThe `qtpy.compat` module provides wrappers for `QFileDialog` static methods and SIP/Shiboken functions.\n\n| Source                               | Wrappers                           |\n|--------------------------------------|------------------------------------|\n| `QFileDialog.getExistingDirectory`   | `qtpy.compat.getexistingdirectory` |\n| `QFileDialog.getOpenFileName`        | `qtpy.compat.getopenfilename`      |\n| `QFileDialog.getOpenFileNames`       | `qtpy.compat.getopenfilenames`     |\n| `QFileDialog.getSaveFileName`        | `qtpy.compat.getsavefilename`      |\n| `sip.isdeleted` / `shiboken.isValid` | `qtpy.compat.isalive`              |\n\n\n### Type Checker Integration\n\nType checkers have no knowledge of installed packages, so these tools require additional configuration.\n\nA Command Line Interface (CLI) is offered to help with usage of QtPy (to get MyPy and Pyright/Pylance args/configurations).\n\n\n#### Mypy\n\nThe `mypy-args` command generates command line arguments for Mypy that will enable it to process the QtPy source files with the same API as QtPy itself would have selected.\n\nTo output a string of Mypy CLI args that will reflect the currently selected Qt API run:\n\nqtpy mypy-args\n```\n\nFor example, in an environment where PyQt5 is installed and selected (or the default fallback, if no binding can be found in the environment), this would output the following:\n\n```text\n--always-true=PYQT5 --always-false=PYSIDE2 --always-false=PYQT6 --always-false=PYSIDE6\n```\n\nUsing Bash or a similar shell, this can be injected into the Mypy command line invocation:\n\n```bash\nmypy --package mypackage $(qtpy mypy-args)\n```\n\n\n#### Pyright/Pylance\n\nIn the case of Pyright, instead of runtime arguments you need to create a `pyrightconfig.json` config file for the project or a `pyright` section in `pyproject.toml`. \nRefer to the [Pyright Configuration](https://github.com/microsoft/pyright/blob/main/docs/configuration.md) for a full reference.\nIn order to set this configuration, QtPy offers the `pyright-config` command for guidance.\n\nTo print the necessary configuration for your `pyrightconfig.json` or `pyproject.toml`, run:\n```bash\nqtpy pyright-config\n```\n\nIf you don't have either of these, you should create them.\n\nFor example, in an environment where PyQt5 is installed and selected (or the default fallback, if no binding can be found in the environment), `qtpy pyright-config` would output the following:\n\n`pyrightconfig.json`\n\n```json\n{\n  \"defineConstant\": {\n    \"PYQT5\": true,\n    \"PYSIDE2\": false,\n    \"PYQT6\": false,\n    \"PYSIDE6\": false\n  }\n}\n```\n\n`pyproject.toml`\n\n```toml\n[tool.pyright.defineConstant]\nPYQT5 = true\nPYSIDE2 = false\nPYQT6 = false\nPYSIDE6 = false\n```\n\n**Note**: This configuration is necessary for the correct usage of the default VSCode type checking feature when using QtPy in your source code.\n\n\n## Testing Matrix\n\nCurrently, QtPy runs tests for different bindings on Linux, Windows and macOS, using Python 3.9, 3.11 and 3.13, and installed via `conda` and `pip`.\nFor the PyQt bindings, the installation of extra packages is also checked via `pip`.\n\nThe current test matrix looks something like this:\n\n|         | Python            | 3.9                |      | 3.11               |                            | 3.13               |                            |\n|---------|-------------------|--------------------|------|--------------------|----------------------------|--------------------|----------------------------|\n| OS      | Binding / manager | conda              | pip  | conda              | pip                        | conda              | pip                        |\n| Linux   | PyQt5             | 5.12               | 5.15 | 5.15               | 5.15 (with extras)         | 5.15               | 5.15                       |\n|         | PyQt6             | skip (unavailable) | 6.5  | skip (unavailable) | 6.8 (with extras)          | skip (unavailable) | 6.8                        |\n|         | PySide2           | 5.13               | 5.12 | 5.15               | skip (no wheels available) | skip (unavailable) | skip (no wheels available) |\n|         | PySide6           | 6.5                | 6.5  | 6.8                | 6.8                        | 6.8                | 6.8                        |\n| Windows | PyQt5             | 5.12               | 5.15 | 5.15               | 5.15 (with extras)         | 5.15               | 5.15                       |\n|         | PyQt6             | skip (unavailable) | 6.2  | skip (unavailable) | 6.8 (with extras)          | skip (unavailable) | 6.8                        |\n|         | PySide2           | 5.13               | 5.15 | 5.15               | skip (no wheels available) | skip (unavailable) | skip (no wheels available) |\n|         | PySide6           | 6.5                | 6.2  | 6.8                | 6.8                        | 6.8                | 6.8                        |\n| MacOS   | PyQt5             | 5.12               | 5.15 | skip               | 5.15 (with extras)         | 5.15               | 5.15                       |\n|         | PyQt6             | skip (unavailable) | 6.2  | skip               | 6.8 (with extras)          | skip (unavailable) | 6.8                        |\n|         | PySide2           | 5.13               | 5.12 | skip               | skip (no wheels available) | skip (unavailable) | skip (no wheels available) |\n|         | PySide6           | 6.8                | 6.2  | skip               | 6.8                        | 6.8                | 6.8                        |\n\n**Note**: The mentioned extra packages for the PyQt bindings are the following:\n\n* `PyQt3D` and `PyQt6-3D`\n* `PyQtChart` and `PyQt6-Charts`\n* `PyQtDataVisualization` and `PyQt6-DataVisualization`\n* `PyQtNetworkAuth` and `PyQt6-NetworkAuth`\n* `PyQtPurchasing`\n* `PyQtWebEngine` and `PyQt6-WebEngine`\n* `QScintilla` and `PyQt6-QScintilla`\n\n\n## Attribution and Acknowledgments\n\nThis project is based on the [pyqode.qt](https://github.com/pyQode/pyqode.qt) project and the [spyderlib.qt](https://github.com/spyder-ide/spyder/tree/2.3/spyderlib/qt) module from the [Spyder](https://github.com/spyder-ide/spyder) project, and also includes contributions adapted from [qt-helpers](https://github.com/glue-viz/qt-helpers), developed as part of the [glue](http://glueviz.org) project.\n\nUnlike `pyqode.qt` this is not a namespace package, so it is not tied to a particular project or namespace.\n\n\n## Success Stories\n\nYou can check out examples of how QtPy adds support for multiple bindings and allows for incremental updates to new binding versions here:\n\n* [git-cola](https://github.com/git-cola/git-cola/issues/232)\n* [spyder](https://github.com/spyder-ide/spyder)\n\n\n## License\n\nThis project is released under the [MIT license](LICENSE.txt).\n\n\n## Contributing\n\nEveryone is welcome to contribute!\nSee our [Contributing guide](CONTRIBUTING.md) for more details.\n\n\n## Sponsors\n\nQtPy is funded thanks to the generous support of our users from around the world through [Open Collective](https://opencollective.com/spyder/) and [NumFOCUS](https://numfocus.org/project/spyder):\n\n[![Sponsors](https://opencollective.com/spyder/sponsors.svg)](https://opencollective.com/spyder#support)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspyder-ide%2Fqtpy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspyder-ide%2Fqtpy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspyder-ide%2Fqtpy/lists"}