<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.qt.io/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AutoSpider</id>
	<title>Qt Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.qt.io/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AutoSpider"/>
	<link rel="alternate" type="text/html" href="https://wiki.qt.io/Special:Contributions/AutoSpider"/>
	<updated>2026-07-18T16:50:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/Tutorial&amp;diff=33849</id>
		<title>Qt for Python/Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/Tutorial&amp;diff=33849"/>
		<updated>2018-05-27T15:22:22Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
&#039;&#039;&#039;(Page under construction)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
The best way to start learning about Qt for Python is to start coding examples.&lt;br /&gt;
Here we try to provide a set of simple examples that will help you understand all the main topics behind every Qt for Python application.&lt;br /&gt;
&lt;br /&gt;
* [[Qt for Python Tutorial HelloWorld|Hello World (QLabel)]]&lt;br /&gt;
* [[Qt for Python Tutorial HelloQML|Hello World (QML)]]&lt;br /&gt;
* [[Qt for Python Tutorial HelloQMessageBox|Hello World (QMessageBox)]]&lt;br /&gt;
* [[Qt for Python Tutorial ClickableButton|Simple clickable button]]&lt;br /&gt;
* [[Qt for Python Tutorial SimpleDialog|Simple Dialog]]&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
* [[Qt for Python Signals and Slots|Signals and Slots]]&lt;br /&gt;
* [[Qt for Python UsingQtProperties|Using Qt Properties]]&lt;br /&gt;
* [[Qt for Python DBusIntegration| DBUS Integration]]&lt;br /&gt;
* [[Qt for Python UiFiles|Using ui files]]&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted/MacOS&amp;diff=33848</id>
		<title>Qt for Python/GettingStarted/MacOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted/MacOS&amp;diff=33848"/>
		<updated>2018-05-27T15:22:09Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]   &lt;br /&gt;
==== Requirements ====                                                               &lt;br /&gt;
* [https://developer.apple.com/xcode/ Xcode] 8.2 (macOS 10.11), 8.3.3 (macOS 10.12) or 9 (macOS 10.13)&lt;br /&gt;
* A Python interpreter (version &#039;&#039;&#039;Python 3.6&#039;&#039;&#039; or &#039;&#039;&#039;Python 2.7&#039;&#039;&#039;). One possibility is to to use a package from https://www.python.org/downloads/ , it is also possible to use a Homebrew / MacPorts provided python.&lt;br /&gt;
**  System Python usage is discouraged, because package installation will attempt to write into system folders and might fail in different ways because of system permissions (unless you use a virtualenv)&lt;br /&gt;
* [http://download.qt.io/official_releases/online_installers/qt-unified-mac-x64-online.dmg Qt 5.6+]&lt;br /&gt;
* [http://download.qt.io/development_releases/prebuilt/libclang/ libclang 3.9 or 4.0] (for 5.9+ branches)               &lt;br /&gt;
* CMake from https://cmake.org/download/ (&#039;&#039;&#039;&amp;gt;= 3.1&#039;&#039;&#039;)&lt;br /&gt;
* Git (&#039;&#039;&#039;&amp;gt;=2&#039;&#039;&#039;)                                                                                       &lt;br /&gt;
* virtualenv (&#039;&#039;&#039;strongly recommended&#039;&#039;&#039;, but optional)                                              &lt;br /&gt;
* Python sphinx package for documentation (optional, pip install sphinx) - documentation generation currently does not work on maCOS&lt;br /&gt;
* &#039;&#039;&#039;No&#039;&#039;&#039; OpenSSL is required because Qt uses [https://developer.apple.com/documentation/security/secure_transport Secure Transport (Apple)] instead.&lt;br /&gt;
&lt;br /&gt;
=== Building from sources ===&lt;br /&gt;
==== Setting up CLANG ====&lt;br /&gt;
* Download [http://download.qt.io/development_releases/prebuilt/libclang/ libclang], e.g.&lt;br /&gt;
 wget http://download.qt.io/development_releases/prebuilt/libclang/libclang-release_39-mac.7z&lt;br /&gt;
* Extract the files, e.g.&lt;br /&gt;
 7z x libclang-release_39-mac.7z                             &lt;br /&gt;
* Export the installation path to the path you choosed to place the files&lt;br /&gt;
 export CLANG_INSTALL_DIR=$PWD/libclang                                                                                                                                  &lt;br /&gt;
==== Getting PySide2 ====                                                  &lt;br /&gt;
* Clone the official repository&lt;br /&gt;
 git clone --recursive https://code.qt.io/pyside/pyside-setup&lt;br /&gt;
* Check out the version you want to build, e.g. 5.9 (Keep in mind you need to use the same version as your Qt installation)&lt;br /&gt;
 cd pyside-setup &amp;amp;&amp;amp; git checkout 5.9&lt;br /&gt;
&lt;br /&gt;
==== Building PySide2 ====                                                 &lt;br /&gt;
* Check your Qt installation path, to specifically use that version of &#039;&#039;qmake&#039;&#039; to build PySide2:&lt;br /&gt;
 which qmake&lt;br /&gt;
* Strongly consider using a virtualenv (to avoid permission issues when building and installing)&lt;br /&gt;
 virtualenv testenv; source testenv/bin/activate&lt;br /&gt;
* Check which Python interpreter is being picked up in PATH (system one, homebrew one, MacPorts one, virtualenv one, or some other) because this influences where the PySide2 package will be installed:&lt;br /&gt;
 which python&lt;br /&gt;
* Build can take a few minutes, so it is recommended to use more than one CPU core (e.g. 8). Remember to replace the paths to your current &#039;&#039;qmake&#039;&#039; path:&lt;br /&gt;
 python setup.py build --qmake=/path/to/qmake --build-tests --ignore-git --jobs=8&lt;br /&gt;
&lt;br /&gt;
==== Installing PySide2 ====                                      &lt;br /&gt;
* To install the PySide2 package into the currently active Python environment (regular, or virtualenv), just run:&lt;br /&gt;
 python setup.py install --qmake=/path/to/qmake --build-tests --ignore-git --jobs=8&lt;br /&gt;
&lt;br /&gt;
==== Test installation ====                                                      &lt;br /&gt;
* You can execute one of the examples to verify the process is properly working.&lt;br /&gt;
* Remember to properly set the environment variables for Qt and PySide2.&lt;br /&gt;
 python examples/examples/widgets/widgets/tetrix.py                      &lt;br /&gt;
== Development ==                                                                                                                                        &lt;br /&gt;
Development happens in the 5.9 and dev branches of the [http://code.qt.io/cgit/pyside/pyside-setup.git/ pyside-setup repository].                                                                               &lt;br /&gt;
The top level repository has the following submodules:                               &lt;br /&gt;
* sources/pyside2-tools: uic, rcc tools    &lt;br /&gt;
* examples/ (5.6 only, examples are no longer a submodule in 5.9+)&lt;br /&gt;
Contributions follow the [[Qt_Project_Guidelines|standard process]].                                                                                                &lt;br /&gt;
It is helpful to have debug binaries and/or symbols for Python available.            &lt;br /&gt;
On macOS you will need to build the Python interpreter with debug symbols by hand.                                                                           &lt;br /&gt;
It is also recommended to use a [http://docs.python-guide.org/en/latest/dev/virtualenvs/ Virtual Environment] for testing to be able to always start from a clean base and avoid issues with write permissions in installations.                                                                             &lt;br /&gt;
On macOS, the command                                                                &lt;br /&gt;
 virtualenv -p /usr/bin/python3-dbg testenv                                          &lt;br /&gt;
creates a Virtual Environment named &#039;&#039;testenv&#039;&#039; for debugging purposes.                                                                                            &lt;br /&gt;
Before building the first time, the module [http://www.sphinx-doc.org/en/1.4.9/ Sphinx] should be installed into the virtual environment:&lt;br /&gt;
 pip install sphinx&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/es&amp;diff=33847</id>
		<title>Qt for Python/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/es&amp;diff=33847"/>
		<updated>2018-05-27T15:21:50Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
{{LangSwitch}}&lt;br /&gt;
== Qt para Python ==&lt;br /&gt;
El proyecto &#039;&#039;&#039;Qt para Python&#039;&#039;&#039; tiene como fin proveer un port completo del module [[PySide]] para Qt 5. El desarrollo comenzó en  [https://github.com/PySide GitHub] en Mayo del 2015. El proyecto finalizó el primer port a Qt 5.3, 5.4 &amp;amp; 5.5. Durante Abril del 2016 The Qt Company decidió apoyar el port (ver [https://groups.google.com/forum/#!topic/pyside-dev/pqwzngAGLWE detalles] ).&lt;br /&gt;
&lt;br /&gt;
Esta página wiki monitorea el progreso del proyecto &#039;&#039;&#039;Qt para Python&#039;&#039;&#039; y provee información adicional relacionada el esfuerzo detrás de él.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Qt para Python&#039;&#039;&#039; estará disponible bajo las licencias GPL, LGPL y commercial.&lt;br /&gt;
&lt;br /&gt;
== Comenzando ==&lt;br /&gt;
* [[Qt_for_Python_GettingStarted|Guia para comenzar en macOS, Windows y Linux]]&lt;br /&gt;
* [[Qt_for_Python_Tutorial|Tutoriales (en construcción)]]&lt;br /&gt;
* [https://bugreports.qt.io/browse/PYSIDE Bug tracker] para reportar problemas.&lt;br /&gt;
* [https://codereview.qt-project.org CodeReview] y [https://codereview.qt-project.org/#/q/project:%255Epyside.%252B,n,z PySide2 parches abiertos] &lt;br /&gt;
* Repositorio Git (la rama 5.9 es la que actualmente se utiliza como objectivo)&lt;br /&gt;
** ssh://codereview.qt-project.org/pyside/pyside-setup &lt;br /&gt;
* [[PySide2_Development_Getting_Started|Desarrollo: comenzando]]&lt;br /&gt;
* [https://doc-snapshots.qt.io/qtforpython/ Documentación oficial (&#039;&#039;en construcción&#039;&#039;)]&lt;br /&gt;
&lt;br /&gt;
== Como luce &#039;&#039;&#039;Qt para Python&#039;&#039;&#039;? == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
from PySide2.QtWidgets import QApplication, QLabel&lt;br /&gt;
                                                     &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app = QApplication([])&lt;br /&gt;
    label = QLabel(&amp;quot;Hola Mundo&amp;quot;)&lt;br /&gt;
    label.show()&lt;br /&gt;
    sys.exit(app.exec_())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Más ejemplos se pueden encontrar en el [http://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples respositorio del proyecto] dentro del directorio &#039;&#039;&#039;examples&#039;&#039;&#039;.&lt;br /&gt;
== Comunidad ==&lt;br /&gt;
&lt;br /&gt;
* Canal IRC oficial en FreeNode &#039;&#039;&#039;#qt-pyside&#039;&#039;&#039;&lt;br /&gt;
* [http://lists.qt-project.org/mailman/listinfo/pyside Lista de correo ofiical]&lt;br /&gt;
* Keybase: [https://keybase.io/team/pyside keybase.io/team/pyside]&lt;br /&gt;
* Gitter: [http://gitter.im/PySide/pyside2 gitter.im/PySide/pyside2]&lt;br /&gt;
&lt;br /&gt;
== Estado del desarrollo ==&lt;br /&gt;
&lt;br /&gt;
=== Progreso del desarrollo semanal === &lt;br /&gt;
El resumen del progreso del desarrollo se encuentra en [https://wiki.qt.io/Qt_for_Python_Development_Notes las notas de desarrollo por fecha.]&lt;br /&gt;
&lt;br /&gt;
=== Notas de desarrollo ===&lt;br /&gt;
&lt;br /&gt;
La mejor forma de ver el desarrollo del proyecto es a través de Jira:&lt;br /&gt;
&lt;br /&gt;
# [https://bugreports.qt.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=17825 Bugs sin resolver]&lt;br /&gt;
# [https://bugreports.qt.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=18025 Todos los bugs (incluyendo los resueltos)]&lt;br /&gt;
&lt;br /&gt;
El segundo enlace es útil para monitorear el progreso en retrospectiva.&lt;br /&gt;
La mejor manera de hacer esto es ordenando la lista por la columna &amp;quot;Updated&amp;quot;.&lt;br /&gt;
Un historial mas extenso se puede encontrar bajo la categoría &amp;quot;User Stories&amp;quot; en Jira.&lt;br /&gt;
&lt;br /&gt;
=== Bindings pendientes ===&lt;br /&gt;
&lt;br /&gt;
La lista de los actuales bindings pendientes se pueden encontrar en la página [[Qt_for_Python_Missing_Bindings|Bindings pendientes en PySide2]]&lt;br /&gt;
&lt;br /&gt;
== Preguntas frecuentes ==&lt;br /&gt;
&lt;br /&gt;
* P: ¿PySide? ¿Qt para Python? ¿Cuál es el nombre?&lt;br /&gt;
** R: El nombre del proyecto es &#039;&#039;&#039;Qt para Python&#039;&#039;&#039; y el nombre del módulo es &#039;&#039;&#039;PySide2&#039;&#039;&#039;.&lt;br /&gt;
* P: ¿Por qué PySide2 y no PySide?&lt;br /&gt;
** R: Ya que PySide se desarrolló para Qt4, cuando se decidió hacer el port a Qt5, el nombre fue cambiado a PySide2 para denotar que correspondía a una nueva versión.&lt;br /&gt;
* P: ¿Dónde puedo encontrar información acerca del antiguo proyecto PySide?&lt;br /&gt;
** R: La página wiki antigua del proyecto está disponible en [[PySide]], &#039;&#039;&#039;pero&#039;&#039;&#039; el software está deprecado, y no hay un soporte oficial. Recomendamos no utilizarlo y preferir PySide2.&lt;br /&gt;
* P: Mi proyecto usa PySide, ¿Qué tan dificil es  adaptarlo para usar PySide2?&lt;br /&gt;
** R: Los cambios son los mismo del cambio entre [https://doc.qt.io/qt-5/qt5-intro.html Qt4 y Qt5], los cambios mayoritariamente corresponden solo a cambiar las delcaraciones &#039;&#039;import&#039;&#039;, ya que muchas clases se movieron de QtGui a QtWidgets.&lt;br /&gt;
::&#039;&#039;Qt 5 es altamente compatible con Qt 4. Es posible para desarrolladores de aplicaciones que usan Qt 4 cambiarse a Qt 5 muy facilmente con la misma funcionalidad y gradualmente desarrollar nuevas cosas que incluyan todas las nuevas características de Qt 5.&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
== Contribuyendo a la wiki de Qt para Python ==&lt;br /&gt;
&lt;br /&gt;
Esta wiki es una area comunitaria en la cual cualquier persona puede contribuir facilmente, y que además peude contener información que cambia muy rápido.&lt;br /&gt;
Por favor comenzar cualquier página wiki nueva relacionada con la categoria &amp;quot;QtForPython&amp;quot;, agregando el siguiente texto al comienzo de la página wiki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[[Category:Qt for Python]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando una nueva página wiki se crea, por favor comenzar el nombre con el prefijo &amp;quot;Qt_for_Python&amp;quot;, para que todas las páginas tengan la misma estructura en su nombre.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/Development_Getting_Started&amp;diff=33846</id>
		<title>Qt for Python/Development Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/Development_Getting_Started&amp;diff=33846"/>
		<updated>2018-05-27T15:21:25Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Qt for Python (PySide2) project is supported by [https://qt.io The Qt Company] and the developers who use Qt for Python.&lt;br /&gt;
This means that anyone who shares an interest in the project can join the community, participate in its decision making processes, and contribute to its development.&lt;br /&gt;
This page will summarize the key points around how you can contribute to the project.&lt;br /&gt;
Qt for Python follows the same development process as the Qt project, it&#039;s in your best interest to read the [http://wiki.qt.io/Main_Page Qt Project Wiki].&lt;br /&gt;
&lt;br /&gt;
== Reporting Bugs ==&lt;br /&gt;
Bugs should be reported to the Qt bug tracker at https://bugreports.qt.io/browse/PYSIDE Please include details on how to reproduce your problem and consider contributing a fix for it.&lt;br /&gt;
&lt;br /&gt;
== Contributing Patches ==&lt;br /&gt;
&lt;br /&gt;
Because PySide2 is a Qt project, all patches must be submitted through [https://codereview.qt.io Qt&#039;s Gerrit code integration system].&lt;br /&gt;
Make sure you go through [https://wiki.qt.io/Gerrit_Introduction Gerrit&#039;s introduction page] before starting contributing.&lt;br /&gt;
All developers need a user account on Gerrit and to agree to the Qt Contributor Agreement. Patches submitted via the bug tracked, mailing list, or pull requests cannot be accepted.&lt;br /&gt;
&lt;br /&gt;
A bug tracker (JIRA) account is needed before a Gerrit account can be created:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;JIRA account&#039;&#039;&#039;&lt;br /&gt;
** Go to [https://bugreports.qt.io bugreports.qt.io] and click on &#039;&#039;&#039;Sign Up&#039;&#039;&#039;&lt;br /&gt;
** Fill out the details&lt;br /&gt;
* &#039;&#039;&#039;Gerrit account&#039;&#039;&#039;&lt;br /&gt;
** Go to [https://codereview.qt-project.org codereview.qt-project.org] and click on &#039;&#039;&#039;Sign In&#039;&#039;&#039;&lt;br /&gt;
** Login with the username/password you created with JIRA&lt;br /&gt;
*** &#039;&#039;&#039;NOTE:&#039;&#039;&#039; Gerrit usernames are case-sensitive, but JIRA usernames are not. If you attempt to log into Gerrit with different capitalizations, you will end up with multiple accounts.&lt;br /&gt;
** Enter your &#039;&#039;&#039;full name&#039;&#039;&#039; and click &#039;&#039;&#039;Save Changes&#039;&#039;&#039;&lt;br /&gt;
** Skip the SSH part for now and scroll all the way down and click &#039;&#039;&#039;&amp;quot;New Contributor Agreement&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
*** Select &#039;&#039;&#039;Individual&#039;&#039;&#039; or &#039;&#039;&#039;Corporate&#039;&#039;&#039;, then scroll down and type &#039;&#039;&#039;I AGREE&#039;&#039;&#039; then &#039;&#039;&#039;submit&#039;&#039;&#039;&lt;br /&gt;
*** To check if your agreement was submitted, click on &#039;&#039;&#039;Settings&#039;&#039;&#039; then &#039;&#039;&#039;Agreements&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Configuring local directories for Gerrit ===&lt;br /&gt;
&lt;br /&gt;
After cloning the project&#039;s repository:&lt;br /&gt;
&lt;br /&gt;
 git clone --recursive https://codereview.qt-project.org/pyside/pyside-setup pyside&lt;br /&gt;
&lt;br /&gt;
be sure you are on the desired branch you want to contribute.&lt;br /&gt;
Most of the work is being done under *5.9*, but you can submit patches to 5.11 and dev&lt;br /&gt;
branches.&lt;br /&gt;
&lt;br /&gt;
Please follow the [[Setting-up-Gerrit | Qt Setting up Gerrit]] instructions, particularly the Local Setup and Configuring Git sections. Add a gerrit remote to local project directory with:&lt;br /&gt;
&lt;br /&gt;
 git remote add gerrit ssh://codereview.qt-project.org/pyside/pyside-setup  &lt;br /&gt;
&lt;br /&gt;
=== Pushing changes to Gerrit ===&lt;br /&gt;
&lt;br /&gt;
After you have committed your changes locally, you can push them to Gerrit like this:&lt;br /&gt;
&lt;br /&gt;
 git push gerrit HEAD:refs/for/&amp;lt;branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;&amp;lt;branch&amp;gt;&#039;&#039;&#039; is the branch you were working at the moment of doing changes in the code.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python&amp;diff=33844</id>
		<title>Qt for Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python&amp;diff=33844"/>
		<updated>2018-05-27T15:20:44Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
{{LangSwitch}}&lt;br /&gt;
http://doc-snapshots.qt.io/qtforpython/_static/pysidelogo.png&lt;br /&gt;
== Qt for Python ==&lt;br /&gt;
The &#039;&#039;&#039;Qt for Python&#039;&#039;&#039; project aims to provide a complete port of the [[PySide]] module to Qt 5. The development started on [https://github.com/PySide GitHub] in May 2015. The project managed to port Pyside to Qt 5.3, 5.&lt;br /&gt;
4 &amp;amp; 5.5. During April 2016 The Qt Company decided to properly support the port (see [https://groups.google.com/forum/#!topic/pyside-dev/pqwzngAGLWE details] ).&lt;br /&gt;
&lt;br /&gt;
This wiki page tracks the progress of the &#039;&#039;&#039;Qt for Python&#039;&#039;&#039; project development and provides further information concerning the effort.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Qt for Python&#039;&#039;&#039; will be available under GPL, LGPL and commercial license.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
* [[Qt_for_Python/GettingStarted|Getting started guide for macOS, Windows and Linux]] &#039;&#039;&#039;(Download and Install/Build)&#039;&#039;&#039;&lt;br /&gt;
* [[Qt_for_Python/Tutorial|Tutorials]]&lt;br /&gt;
* [https://bugreports.qt.io/browse/PYSIDE Bug tracker] to report any issue.&lt;br /&gt;
* [https://codereview.qt-project.org CodeReview] and [https://codereview.qt-project.org/#/q/project:%255Epyside.%252B,n,z PySide2 open patches] &lt;br /&gt;
* Git repository (5.9 branch is the branch currently worked on for PySide2)&lt;br /&gt;
** ssh://codereview.qt-project.org/pyside/pyside-setup &lt;br /&gt;
* [[Qt_for_Python/Development_Getting_Started|Development: Getting started]]&lt;br /&gt;
* [https://doc-snapshots.qt.io/qtforpython/ Official documentation] (snapshot)&lt;br /&gt;
&lt;br /&gt;
== How does &#039;&#039;&#039;Qt for Python&#039;&#039;&#039; look like? == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
from PySide2.QtWidgets import QApplication, QLabel&lt;br /&gt;
                                                     &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app = QApplication([])&lt;br /&gt;
    label = QLabel(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
    label.show()&lt;br /&gt;
    sys.exit(app.exec_())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More examples can be found in the [http://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples project&#039;s repository] inside the &#039;&#039;&#039;examples&#039;&#039;&#039; directory.&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* Official IRC channel on FreeNode &#039;&#039;&#039;#qt-pyside&#039;&#039;&#039;&lt;br /&gt;
* [http://lists.qt-project.org/mailman/listinfo/pyside Official Mailing list]&lt;br /&gt;
* Keybase:&lt;br /&gt;
** [https://keybase.io/team/pyside keybase.io/team/pyside]&lt;br /&gt;
** [https://keybase.io/team/pyside keybase.io/team/theqtcompany] (subteam &#039;&#039;theqtcompany.pyside&#039;&#039;)&lt;br /&gt;
* Gitter: [http://gitter.im/PySide/pyside2 gitter.im/PySide/pyside2]&lt;br /&gt;
&lt;br /&gt;
== Development Status ==&lt;br /&gt;
&lt;br /&gt;
=== Weekly development progress === &lt;br /&gt;
The summary of the development progress can be found in [https://wiki.qt.io/Qt_for_Python_Development_Notes Development Notes by date]&lt;br /&gt;
&lt;br /&gt;
=== Pyside Development Progress Notes ===&lt;br /&gt;
&lt;br /&gt;
The most current view of the progress can be found in Jira:&lt;br /&gt;
&lt;br /&gt;
# [https://bugreports.qt.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=17825 Unresolved issues]&lt;br /&gt;
# [https://bugreports.qt.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=18025 All issues (including resolved)]&lt;br /&gt;
&lt;br /&gt;
The second link is useful to monitor the progress of the backlog. The best way to achieve this is to sort the list by the &amp;quot;Updated&amp;quot; column.&lt;br /&gt;
Larger backlog/feature items are filed as &amp;quot;User Stories&amp;quot; in Jira.&lt;br /&gt;
&lt;br /&gt;
=== Missing PySide2 bindings ===&lt;br /&gt;
&lt;br /&gt;
The list of the current missing bindings can be found in [[Qt_for_Python_Missing_Bindings|Missing PySide2 bindings]]&lt;br /&gt;
&lt;br /&gt;
=== Outstanding tasks for release ===&lt;br /&gt;
&lt;br /&gt;
# Determine PySide2 package number&lt;br /&gt;
# Ensure multi target packages can be created (long standing - reduced Python API usage )&lt;br /&gt;
# General Doc changes required for release&lt;br /&gt;
## Getting started&lt;br /&gt;
## Some examples documented&lt;br /&gt;
## pyinstaller usage&lt;br /&gt;
## Class documentation polish&lt;br /&gt;
## snapshot generation on http://doc-snapshot.qt-project.org/&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
* Q: PySide? Qt for Python? what is the name?&lt;br /&gt;
** A: The name of the project is &#039;&#039;&#039;Qt for Python&#039;&#039;&#039; and the name of the module is &#039;&#039;&#039;PySide2&#039;&#039;&#039;.&lt;br /&gt;
* Q: Why PySide2 and not just PySide?&lt;br /&gt;
** A: Since PySide was developed for Qt4, when the port was made to support Qt5, the name was changed to PySide2 to infer that is was a newer version.&lt;br /&gt;
* Q: Where I can find information about the old PySide project?&lt;br /&gt;
** A: The old wiki page of the project is available on [[PySide]], &#039;&#039;&#039;but&#039;&#039;&#039; the project is deprecated and there is no official support for it. We highly recommend not to use it.&lt;br /&gt;
* Q: My project is using PySide, how hard would it be to adapt it to PySide2?&lt;br /&gt;
** A: The changes are the same as between [https://doc.qt.io/qt-5/qt5-intro.html Qt4 and Qt5], and for PySide users it mostly means adapting the &#039;&#039;import&#039;&#039; statements since many classes were moved from QtGui to QtWidgets.&lt;br /&gt;
::&#039;&#039;Qt 5 is highly compatible with Qt 4. It is possible for developers of Qt 4 applications to seamlessly move to Qt 5 with their current functionality and gradually develop new things, leveraging all the great items Qt 5 makes possible.&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Qt for Python Wiki ==&lt;br /&gt;
&lt;br /&gt;
This Wiki is a community area where you can easily contribute, and which may contain rapidly changing information.&lt;br /&gt;
Please put any wiki pages related to Qt for Python into the &amp;quot;QtForPython&amp;quot; category by adding the following text to the top of the page:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[[Category:Qt for Python]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When creating a new wiki page, please start the name with the prefix &amp;quot;Qt_for_Python/&amp;quot;, so all the wiki page names will have the same structure and breadcrumbs are generated for easier navigation.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python_UsingQtProperties&amp;diff=33843</id>
		<title>Qt for Python UsingQtProperties</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python_UsingQtProperties&amp;diff=33843"/>
		<updated>2018-05-27T15:19:14Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
&lt;br /&gt;
PySide2 provides a &#039;&#039;Property&#039;&#039; function which allows for declaring properties that simultaneously behave both as Qt and Python properties, and have their setters and getters defined as Python functions.&lt;br /&gt;
&lt;br /&gt;
A short example illustrating defining and accessing a Qt property from Python is given below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
from PySide2.QtCore import QObject, Property                                                        &lt;br /&gt;
                                                                                                    &lt;br /&gt;
class MyObject(QObject):                                                                            &lt;br /&gt;
    def __init__(self,startval=42):                                                                 &lt;br /&gt;
        QObject.__init__(self)                                                                      &lt;br /&gt;
        self.ppval = startval                                                                       &lt;br /&gt;
                                                                                                    &lt;br /&gt;
    def readPP(self):                                                                                   &lt;br /&gt;
        return self.ppval                                                                               &lt;br /&gt;
                                                                                                    &lt;br /&gt;
    def setPP(self,val):                                                                                &lt;br /&gt;
        self.ppval = val                                                                                &lt;br /&gt;
                                                                                                    &lt;br /&gt;
    pp = Property(int, readPP, setPP)     &lt;br /&gt;
                                                              &lt;br /&gt;
obj = MyObject()                                                                                    &lt;br /&gt;
obj.pp = 47                                                                                         &lt;br /&gt;
print(obj.pp) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties in QML expressions ==&lt;br /&gt;
&lt;br /&gt;
If you are using properties of your objects in QML expressions, QML requires the property to be NOTIFYable. This can be done using a simple signal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
from PySide2.QtCore import QObject, Signal, Property&lt;br /&gt;
&lt;br /&gt;
class Person(QObject):&lt;br /&gt;
    def __init__(self, name):&lt;br /&gt;
        QObject.__init__(self)&lt;br /&gt;
        self._person_name = name&lt;br /&gt;
&lt;br /&gt;
    def _name(self):&lt;br /&gt;
        return self._person_name&lt;br /&gt;
&lt;br /&gt;
    @Signal&lt;br /&gt;
    def name_changed(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    name = Property(str, _name, notify=name_changed)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted/X11&amp;diff=33841</id>
		<title>Qt for Python/GettingStarted/X11</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted/X11&amp;diff=33841"/>
		<updated>2018-05-27T15:17:44Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]   &lt;br /&gt;
==== Requirements ====                                              &lt;br /&gt;
* &#039;&#039;&#039;GCC&#039;&#039;&#039; (Linux)                                                                                                                                                                                                                          &lt;br /&gt;
* A Python interpreter (version &#039;&#039;&#039;Python 3.6&#039;&#039;&#039; or &#039;&#039;&#039;Python 2.7&#039;&#039;&#039;). One possibility is to to use a package from https://www.python.org/downloads/ , a system installed package with an appropriate version should work as well.&lt;br /&gt;
* [http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run Qt 5.6+]&lt;br /&gt;
* [http://download.qt.io/development_releases/prebuilt/libclang/ libclang 3.9 or 4.0] (for 5.9+ branches)            &lt;br /&gt;
* CMake from https://cmake.org/download/ (&#039;&#039;&#039;&amp;gt;= 3.1&#039;&#039;&#039;)  &lt;br /&gt;
* Git (&#039;&#039;&#039;&amp;gt;=2&#039;&#039;&#039;)                                        &lt;br /&gt;
* virtualenv (&#039;&#039;&#039;strongly recommended&#039;&#039;&#039;, but optional)                                              &lt;br /&gt;
* Python sphinx package for documentation (optional, pip install sphinx)&lt;br /&gt;
&lt;br /&gt;
=== Building from sources ===&lt;br /&gt;
&lt;br /&gt;
==== Setting up CLANG ====&lt;br /&gt;
&lt;br /&gt;
* Download [http://download.qt.io/development_releases/prebuilt/libclang/ libclang], e.g.&lt;br /&gt;
 wget http://download.qt.io/development_releases/prebuilt/libclang/libclang-release_39-linux-Rhel7.2-gcc5.3-x86_64.7z&lt;br /&gt;
&lt;br /&gt;
* Extract the files, e.g.&lt;br /&gt;
 7z x libclang-release_39-linux-Rhel7.2-gcc5.3-x86_64.7z                             &lt;br /&gt;
&lt;br /&gt;
* Export the installation path to the path you choosed to place the files&lt;br /&gt;
 export CLANG_INSTALL_DIR=$PWD/libclang                                               &lt;br /&gt;
                                                                                     &lt;br /&gt;
==== Getting PySide2 ====                                                  &lt;br /&gt;
&lt;br /&gt;
* Clone the official repository:&lt;br /&gt;
 git clone --recursive https://code.qt.io/pyside/pyside-setup&lt;br /&gt;
* Check out the version you want to build, e.g. 5.9. Keep in mind that you must use the same version as your Qt installation.&lt;br /&gt;
 cd pyside-setup &amp;amp;&amp;amp; git checkout 5.9&lt;br /&gt;
&lt;br /&gt;
==== Building PySide2 ====                                                 &lt;br /&gt;
&lt;br /&gt;
* Check your Qt installation path, to specifically use that version of &#039;&#039;qmake&#039;&#039; to build PySide2:&lt;br /&gt;
 which qmake&lt;br /&gt;
&lt;br /&gt;
* Build can take a few minutes, so it is recommended to use more than one CPU core (e.g. 8). Remember to replace the paths to your current &#039;&#039;qmake&#039;&#039; path:&lt;br /&gt;
 python setup.py build --qmake=/path/to/qmake --build-tests --ignore-git --jobs=8&lt;br /&gt;
&lt;br /&gt;
==== Installing PySide2 ====                                      &lt;br /&gt;
&lt;br /&gt;
* To install on the current directory, just run:&lt;br /&gt;
 python setup.py install --qmake=/path/to/qmake  --openssl=/path/to/openssl --build-tests --ignore-git --jobs=8&lt;br /&gt;
&lt;br /&gt;
==== Test installation ====                                                      &lt;br /&gt;
* You can execute one of the examples to verify the process is properly working.&lt;br /&gt;
* Remember to properly set the environment variables for Qt and PySide2.&lt;br /&gt;
 python examples/examples/widgets/widgets/tetrix.py&lt;br /&gt;
&lt;br /&gt;
== Development ==                                                                    &lt;br /&gt;
                                                                                     &lt;br /&gt;
Development happens in the 5.9 and dev branches of the [http://code.qt.io/cgit/pyside/pyside-setup.git/ pyside-setup repository].&lt;br /&gt;
                                                                                     &lt;br /&gt;
The top level repository has the following submodules:                               &lt;br /&gt;
* sources/pyside2-tools: uic, rcc tools&lt;br /&gt;
* examples/ (5.6 only, examples are no longer a submodule in 5.9+)&lt;br /&gt;
                                                                                     &lt;br /&gt;
Contributions follow the [[Qt_Project_Guidelines|standard process]].&lt;br /&gt;
                                                                                     &lt;br /&gt;
It is helpful to have debug binaries or symbols for Python available.            &lt;br /&gt;
Debug packages can be installed separately in some Linux distributions&lt;br /&gt;
(e.g.: Ubuntu, the packages python3-dbg, libpython3-dbg provide a debug binary python3-dbg)&lt;br /&gt;
&lt;br /&gt;
If your distribution does not include them, you can [https://www.python.org/downloads/ download python] sources&lt;br /&gt;
and compile it by yourself, e.g.&lt;br /&gt;
 ./configure --prefix=/where/to/install/python/path CFLAGS=&amp;quot;-O0 -fno-inline -fno-omit-frame-pointer -g&amp;quot; LDFLAGS=&amp;quot;-O0&amp;quot; CPPFLAGS=&amp;quot;-O0&amp;quot; OPT=&amp;quot;-O0 -g&amp;quot;&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
It is also recommended to use a [http://docs.python-guide.org/en/latest/dev/virtualenvs/ Virtual Environment] for testing to be able to always start from a clean base and avoid issues with write permissions in installations.&lt;br /&gt;
&lt;br /&gt;
A new virtual environment can be created as follows:                                                                                     &lt;br /&gt;
 virtualenv -p /usr/bin/python3-dbg testenv                                          &lt;br /&gt;
Please take into consideration that the binary name might be different in your system,&lt;br /&gt;
and that you can choose a different name for the environment instead of &#039;&#039;testenv&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Wrong RUNPATH / rpath&#039;&#039;&#039;&lt;br /&gt;
If you choose to build Python from sources in shared library configuration, it might be the case that the rpath is not set properly, which means that the built python binary might use the system python shared library, instead of the custom build shared library. &lt;br /&gt;
You can &#039;&#039;patch&#039;&#039; the interpreter rpath values with a binary that PySide2 provides:&lt;br /&gt;
 cd pyside-setup&lt;br /&gt;
 ./patchelf --set-rpath /path/to/your/local/python/lib /path/to/your/python/virtualenv/binary/python&lt;br /&gt;
And then you can proceed to re-install PySide2.&lt;br /&gt;
(you can check if the patch worked with &#039;&#039;readelf -d /path/to/your/python/virtualenv/binary/python&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Missing libICU causes linking problems&#039;&#039;&#039;&lt;br /&gt;
From 5.9+ you can get a copy of libICU by specifying &#039;&#039;--standalone&#039;&#039; (but not including &#039;&#039;--iculib-url&#039;&#039;) as an argument to &#039;&#039;setup.py&#039;&#039; execution.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python_UiFiles&amp;diff=33840</id>
		<title>Qt for Python UiFiles</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python_UiFiles&amp;diff=33840"/>
		<updated>2018-05-27T15:17:32Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
&lt;br /&gt;
This page describes the use of Qt Creator to create Graphical Interfaces for your PySide Software.&lt;br /&gt;
You will need Qt Creator to design and modify your interface (ui file)&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know how to use Qt Creator, please go to [http://doc.qt.io/qtcreator/creator-using-qt-designer.html Using Qt Designer].&lt;br /&gt;
&lt;br /&gt;
At Qt Creator, create a new Qt Design Form, choose &amp;quot;Main Window&amp;quot; for template.&lt;br /&gt;
And save as &amp;quot;mainwindow.ui&amp;quot;.&lt;br /&gt;
Add a Qlabel to the center of the centralwidget.&lt;br /&gt;
&lt;br /&gt;
Your file (mainwindow.ui) should look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;ui version=&amp;quot;4.0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;class&amp;gt;MainWindow&amp;lt;/class&amp;gt;&lt;br /&gt;
 &amp;lt;widget class=&amp;quot;QMainWindow&amp;quot; name=&amp;quot;MainWindow&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;property name=&amp;quot;geometry&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;rect&amp;gt;&lt;br /&gt;
 &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;&lt;br /&gt;
 &amp;lt;y&amp;gt;0&amp;lt;/y&amp;gt;&lt;br /&gt;
 &amp;lt;width&amp;gt;82&amp;lt;/width&amp;gt;&lt;br /&gt;
 &amp;lt;height&amp;gt;64&amp;lt;/height&amp;gt;&lt;br /&gt;
 &amp;lt;/rect&amp;gt;&lt;br /&gt;
 &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;property name=&amp;quot;windowTitle&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;string&amp;gt;MainWindow&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;widget class=&amp;quot;QWidget&amp;quot; name=&amp;quot;centralwidget&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;layout class=&amp;quot;QGridLayout&amp;quot; name=&amp;quot;gridLayout&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;item row=&amp;quot;0&amp;quot; column=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;widget class=&amp;quot;QLabel&amp;quot; name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;property name=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;string&amp;gt;Hello World!&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/widget&amp;gt;&lt;br /&gt;
 &amp;lt;/item&amp;gt;&lt;br /&gt;
 &amp;lt;/layout&amp;gt;&lt;br /&gt;
 &amp;lt;/widget&amp;gt;&lt;br /&gt;
 &amp;lt;widget class=&amp;quot;QMenuBar&amp;quot; name=&amp;quot;menubar&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;property name=&amp;quot;geometry&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;rect&amp;gt;&lt;br /&gt;
 &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;&lt;br /&gt;
 &amp;lt;y&amp;gt;0&amp;lt;/y&amp;gt;&lt;br /&gt;
 &amp;lt;width&amp;gt;82&amp;lt;/width&amp;gt;&lt;br /&gt;
 &amp;lt;height&amp;gt;21&amp;lt;/height&amp;gt;&lt;br /&gt;
 &amp;lt;/rect&amp;gt;&lt;br /&gt;
 &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/widget&amp;gt;&lt;br /&gt;
 &amp;lt;widget class=&amp;quot;QStatusBar&amp;quot; name=&amp;quot;statusbar&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/widget&amp;gt;&lt;br /&gt;
 &amp;lt;resources/&amp;gt;&lt;br /&gt;
 &amp;lt;connections/&amp;gt;&lt;br /&gt;
&amp;lt;/ui&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, using PySide2 we will load the ui file and start our application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
# main.py&lt;br /&gt;
import sys&lt;br /&gt;
from PySide2.QtUiTools import QUiLoader&lt;br /&gt;
from PySide2.QtWidgets import QApplication&lt;br /&gt;
from PySide2.QtCore import QFile&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app = QApplication(sys.argv)&lt;br /&gt;
&lt;br /&gt;
    file = QFile(&amp;quot;mainwindow.ui&amp;quot;)&lt;br /&gt;
    file.open(QFile.ReadOnly)&lt;br /&gt;
&lt;br /&gt;
    loader = QUiLoader()&lt;br /&gt;
    window = loader.load(file)&lt;br /&gt;
    window.show()&lt;br /&gt;
&lt;br /&gt;
    sys.exit(app.exec_())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And to run it, just a &amp;lt;code&amp;gt;python main.py&amp;lt;/code&amp;gt; will do the job.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted/Windows&amp;diff=33839</id>
		<title>Qt for Python/GettingStarted/Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted/Windows&amp;diff=33839"/>
		<updated>2018-05-27T15:16:12Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]   &lt;br /&gt;
The Qt library has to be built with the same version of MSVC as Python and PySide2, this can be selected when using the online installer.  &lt;br /&gt;
                                                                                     &lt;br /&gt;
==== Requirements ====                                                               &lt;br /&gt;
* Qt package from https://www.qt.io or a custom build of Qt (preferably &#039;&#039;&#039;Qt 5.9&#039;&#039;&#039;)&lt;br /&gt;
* A Python interpreter (version &#039;&#039;&#039;Python 3.6&#039;&#039;&#039; or &#039;&#039;&#039;Python 2.7&#039;&#039;&#039;). One possibility is to use a package from https://www.python.org/downloads/ &lt;br /&gt;
* [http://landinghub.visualstudio.com/visual-cpp-build-tools MSVC2015] (for Python 3 on Windows), MSVC2008 (for Python 2 on Windows)         &lt;br /&gt;
* CMake from https://cmake.org/download/ (&#039;&#039;&#039;&amp;gt;= 3.1&#039;&#039;&#039;)                              &lt;br /&gt;
* Git from https://git-scm.com/download/win (&#039;&#039;&#039;&amp;gt;= 2&#039;&#039;&#039;)&lt;br /&gt;
* libclang (required for the 5.9 and dev branches) from [http://download.qt.io/development_releases/prebuilt/libclang/ download.qt.io] (&#039;&#039;&#039;3.9 or 4.0&#039;&#039;&#039;)&lt;br /&gt;
* [https://sourceforge.net/projects/openssl/ OpenSSL] (optional for SSL support, Qt must have been configured using the same SSL library)&lt;br /&gt;
* virtualenv (strongly recommended, but optional)                                                 &lt;br /&gt;
* Python sphinx package for documentation (optional, pip install sphinx)&lt;br /&gt;
&lt;br /&gt;
=== Building from sources on Windows 10 ===&lt;br /&gt;
The following steps are performed on the command prompt (&#039;&#039;cmd&#039;&#039;) that is included with the MSVC2015 package, to include the proper compiler configuration.&lt;br /&gt;
A 64bit infrastructure is assumed in the procedure, but if the host is a 32bit environment it is possible to just download the proper architecture packages.&lt;br /&gt;
The packages used on this process are:&lt;br /&gt;
* 7zip (&#039;&#039;7z1700-x64&#039;&#039;)&lt;br /&gt;
* Git (&#039;&#039;Git-2.15.1.2-64&#039;&#039;)&lt;br /&gt;
* CMake (&#039;&#039;cmake-3.10.2-win64-x64&#039;&#039;)&lt;br /&gt;
* Python (&#039;&#039;python-3.6.4-amd64&#039;&#039;)&lt;br /&gt;
* MSVC2015 (&#039;&#039;visualcppbuildtools_full&#039;&#039;)&lt;br /&gt;
* CLANG (&#039;&#039;libclang-release_39-windows-vs2015_64.7z&#039;&#039;)&lt;br /&gt;
* Qt 5.9.4 (&#039;&#039;qt-unified-windows-x86-3.0.2-online&#039;&#039;)&lt;br /&gt;
==== Setting up CLANG ====&lt;br /&gt;
* Download [http://download.qt.io/development_releases/prebuilt/libclang/ libclang], e.g.&lt;br /&gt;
 [http://download.qt.io/development_releases/prebuilt/libclang/libclang-release_39-windows-vs2015_64.7z http://download.qt.io/development_releases/prebuilt/libclang/libclang-release_39-windows-vs2015_64.7z]&lt;br /&gt;
* Extract the files, e.g. using [http://www.7-zip.org/ 7zip]                         &lt;br /&gt;
* Move the directory &#039;&#039;libclang&#039;&#039; to any desired path, e.g &#039;&#039;c:\&#039;&#039;, and then set these two required environment variables:&lt;br /&gt;
 set LLVM_INSTALL_DIR=c:\libclang&lt;br /&gt;
 set PATH=C:\libclang\bin;%PATH%&lt;br /&gt;
==== Getting PySide2 ====                                                  &lt;br /&gt;
* You must [https://git-scm.com/download/win download git] in order to clone the repository.&lt;br /&gt;
* Cloning the official repository&lt;br /&gt;
 git clone --recursive https://code.qt.io/pyside/pyside-setup&lt;br /&gt;
* Checking out the version that we want to build, e.g. 5.9 (Keep in mind you need to use the same version as your Qt installation)&lt;br /&gt;
 cd pyside-setup &amp;amp;&amp;amp; git checkout 5.9&lt;br /&gt;
&lt;br /&gt;
==== Building PySide2 ====                                                 &lt;br /&gt;
* You must [https://www.python.org/downloads/windows/ download Python] to build PySide2 (3.6 is recommended)&lt;br /&gt;
* Check your Qt installation path, to specifically use that version of &#039;&#039;qmake&#039;&#039; to build PySide2.&lt;br /&gt;
e.g. &#039;&#039;E:\Qt\5.9.4\msvc2015_64\bin\qmake.exe&#039;&#039;&lt;br /&gt;
* Build can take a few minutes, so it is recommended to use more than one CPU core (e.g. 8). Remember to replace the paths to your current &#039;&#039;qmake&#039;&#039; path:&lt;br /&gt;
 python setup.py build --qmake=E:\Qt\5.9.4\msvc2015_64\bin\qmake.exe --openssl=C:\Dev\qtdev\OpenSSL-Win64\bin  --build-tests --ignore-git --jobs=8                                                                              &lt;br /&gt;
==== Installing PySide2 ====                                      &lt;br /&gt;
* To install on the current directory, just run:&lt;br /&gt;
 python setup.py install --qmake=E:\Qt\5.9.4\msvc2015_64\bin\qmake.exe  --openssl=C:\Dev\qtdev\OpenSSL-Win64\bin --build-tests --ignore-git --jobs=8                                                                                &lt;br /&gt;
==== Test installation ====                                                      &lt;br /&gt;
* You can execute one of the examples to verify the process is properly working.&lt;br /&gt;
* Remember to properly set the environment variables for Qt and PySide2.&lt;br /&gt;
 python examples/examples/widgets/widgets/tetrix.py&lt;br /&gt;
== Build considerations ==&lt;br /&gt;
Building PySide2 on Windows is a bit special in the sense that some rules have to be followed:&lt;br /&gt;
* The MSVC version used to build Python, Qt and PySide2 &#039;&#039;&#039;must&#039;&#039;&#039; be the same.&lt;br /&gt;
** In practice this means that if you use the official Python 3.x package from [https://www.python.org/downloads/] which is built with MSVC 2015, you need to use a Qt package built with MSVC 2015.&lt;br /&gt;
** Using the official Python 2.x package will not be feasible, due to it being built with MSVC 2008, and there being no official prebuilt Qt package for the same MSVC version.&lt;br /&gt;
* The build configuration (debug or release) has to be the same for Python, Qt and PySide2.&lt;br /&gt;
* The above considerations are necessary to ensure that only a &#039;&#039;&#039;single&#039;&#039;&#039; MSVC runtime library is loaded, otherwise this can cause &#039;&#039;&#039;memory corruption, crashes or undefined behavior&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Development ==                                                                                                                                                            &lt;br /&gt;
Development happens in the 5.9 and dev branches of the [http://code.qt.io/cgit/pyside/pyside-setup.git/ pyside-setup repository].                                                                                  &lt;br /&gt;
The top level repository has the following submodules:                                  &lt;br /&gt;
* sources/pyside2-tools: uic, rcc tools  &lt;br /&gt;
* sources/pyside2-examples (5.6 only, examples are no longer a submodule in 5.9+)                                                                                                                                  &lt;br /&gt;
Contributions follow the [[Qt_Project_Guidelines|standard process]].                                                                                                  &lt;br /&gt;
It is helpful to have debug binaries and/or symbols for Python available.               &lt;br /&gt;
On Windows, this is done by choosing &#039;&#039;Customized Installation&#039;&#039; when installing Python and ticking the respective check boxes.                                                                                 &lt;br /&gt;
It is also recommended to use a [http://docs.python-guide.org/en/latest/dev/virtualenvs/ Virtual Environment] for testing to be able to always start from a clean base and avoid issues with write permissions in installations.                                                                                 &lt;br /&gt;
On Windows an installation step may be required:&lt;br /&gt;
 python -m pip install virtualenv                                                       &lt;br /&gt;
 python -m virtualenv testenv                                                                                                                                           &lt;br /&gt;
The Virtual Environment is activated by·                                                &lt;br /&gt;
 CALL testenv\Scripts\activate.bat                                                                                                                                                                                                                                                                                              &lt;br /&gt;
Before building the first time, the module [http://www.sphinx-doc.org/en/1.4.9/ Sphinx] should be installed into the virtual environment:·&lt;br /&gt;
 pip install sphinx&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python_Missing_Bindings&amp;diff=33838</id>
		<title>Qt for Python Missing Bindings</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python_Missing_Bindings&amp;diff=33838"/>
		<updated>2018-05-27T15:15:58Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]   &lt;br /&gt;
= PySide2 bindings for Qt 5.11 =&lt;br /&gt;
Using Qt version 5.11 documentation to find public API Qt types and test if the types are present in the PySide2 package.&lt;br /&gt;
Similar report:&lt;br /&gt;
https://gist.github.com/ethanhs/6c626ca4e291f3682589699296377d3a&lt;br /&gt;
&lt;br /&gt;
This report was generated by running the following command:&lt;br /&gt;
 python missing_bindings.py --qt-version 5.11 -w all&lt;br /&gt;
on the following date:&lt;br /&gt;
 2018-05-22 11:27:08 GMT&lt;br /&gt;
&lt;br /&gt;
===== QtCore =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtcore-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtCore for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtCore:&#039;&#039;&#039; 175&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtCore:&lt;br /&gt;
&lt;br /&gt;
 QAbstractNativeEventFilter&lt;br /&gt;
 QAtomicInt&lt;br /&gt;
 QAtomicInteger&lt;br /&gt;
 QAtomicPointer&lt;br /&gt;
 QBEInteger&lt;br /&gt;
 QByteArrayList&lt;br /&gt;
 QCache&lt;br /&gt;
 QContiguousCache&lt;br /&gt;
 QDeadlineTimer&lt;br /&gt;
 QEventLoopLocker&lt;br /&gt;
 QException&lt;br /&gt;
 QFuture&lt;br /&gt;
 QFutureSynchronizer&lt;br /&gt;
 QFutureWatcher&lt;br /&gt;
 QIdentityProxyModel&lt;br /&gt;
 QJsonObject&lt;br /&gt;
 QKeyValueIterator&lt;br /&gt;
 QLEInteger&lt;br /&gt;
 QLibrary&lt;br /&gt;
 QLockFile&lt;br /&gt;
 QLoggingCategory&lt;br /&gt;
 QMessageAuthenticationCode&lt;br /&gt;
 QMessageLogger&lt;br /&gt;
 QMetaType&lt;br /&gt;
 QObjectCleanupHandler&lt;br /&gt;
 QOperatingSystemVersion&lt;br /&gt;
 QSharedMemory&lt;br /&gt;
 QSignalBlocker&lt;br /&gt;
 QStaticByteArrayMatcher&lt;br /&gt;
 QStringView&lt;br /&gt;
 QThreadStorage&lt;br /&gt;
 QUnhandledException&lt;br /&gt;
 QVariant&lt;br /&gt;
 QWinEventNotifier&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 34&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtGui =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtgui-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtGui for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtGui:&#039;&#039;&#039; 193&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtGui:&lt;br /&gt;
&lt;br /&gt;
 QAccessibleEditableTextInterface&lt;br /&gt;
 QAccessibleObject&lt;br /&gt;
 QAccessibleStateChangeEvent&lt;br /&gt;
 QAccessibleTableCellInterface&lt;br /&gt;
 QAccessibleTableModelChangeEvent&lt;br /&gt;
 QAccessibleTextCursorEvent&lt;br /&gt;
 QAccessibleTextInsertEvent&lt;br /&gt;
 QAccessibleTextInterface&lt;br /&gt;
 QAccessibleTextRemoveEvent&lt;br /&gt;
 QAccessibleTextSelectionEvent&lt;br /&gt;
 QAccessibleTextUpdateEvent&lt;br /&gt;
 QAccessibleValueChangeEvent&lt;br /&gt;
 QAccessibleValueInterface&lt;br /&gt;
 QGlyphRun&lt;br /&gt;
 QIconEngine.ScaledPixmapArgument&lt;br /&gt;
 QInputMethod&lt;br /&gt;
 QInputMethodQueryEvent&lt;br /&gt;
 QNativeGestureEvent&lt;br /&gt;
 QOpenGLPaintDevice&lt;br /&gt;
 QOpenGLTextureBlitter&lt;br /&gt;
 QPlatformSurfaceEvent&lt;br /&gt;
 QPointingDeviceUniqueId&lt;br /&gt;
 QRasterPaintEngine&lt;br /&gt;
 QRgba64&lt;br /&gt;
 QScrollEvent&lt;br /&gt;
 QScrollPrepareEvent&lt;br /&gt;
 QSupportedWritingSystems&lt;br /&gt;
 QVulkanDeviceFunctions&lt;br /&gt;
 QVulkanFunctions&lt;br /&gt;
 QVulkanInstance&lt;br /&gt;
 QVulkanWindow&lt;br /&gt;
 QVulkanWindowRenderer&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMultimedia =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtmultimedia-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtMultimedia for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtMultimedia:&#039;&#039;&#039; 95&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtMultimedia:&lt;br /&gt;
&lt;br /&gt;
 QAbstractPlanarVideoBuffer&lt;br /&gt;
 QAudioBuffer.StereoFrame&lt;br /&gt;
 QAudioSystemPlugin&lt;br /&gt;
 QCameraExposure&lt;br /&gt;
 QCameraFeedbackControl&lt;br /&gt;
 QCameraFlashControl&lt;br /&gt;
 QCameraFocus&lt;br /&gt;
 QCameraFocusControl&lt;br /&gt;
 QCameraImageProcessing&lt;br /&gt;
 QMediaMetaData&lt;br /&gt;
 QMediaService&lt;br /&gt;
 QMediaServiceCameraInfoInterface&lt;br /&gt;
 QMediaServiceDefaultDeviceInterface&lt;br /&gt;
 QMediaServiceFeaturesInterface&lt;br /&gt;
 QMediaServiceProviderPlugin&lt;br /&gt;
 QMediaServiceSupportedDevicesInterface&lt;br /&gt;
 QMediaServiceSupportedFormatsInterface&lt;br /&gt;
 QMediaStreamsControl&lt;br /&gt;
 QMediaTimeInterval&lt;br /&gt;
 QMediaVideoProbeControl&lt;br /&gt;
 QMetaDataReaderControl&lt;br /&gt;
 QMetaDataWriterControl&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 22&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMultimediaWidgets =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtmultimediawidgets-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtMultimediaWidgets for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtMultimediaWidgets:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtNetwork =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtnetwork-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtNetwork for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtNetwork:&#039;&#039;&#039; 48&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtNetwork:&lt;br /&gt;
&lt;br /&gt;
 QSctpServer&lt;br /&gt;
 QSctpSocket&lt;br /&gt;
 QSslEllipticCurve&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtQml =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtqml-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtQml for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtQml:&#039;&#039;&#039; 24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtQml:&lt;br /&gt;
&lt;br /&gt;
 QQmlContext.PropertyPair&lt;br /&gt;
 QQmlListProperty&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtQuick =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtquick-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtQuick for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtQuick:&#039;&#039;&#039; 45&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtQuick:&lt;br /&gt;
&lt;br /&gt;
 QQuickItem.ItemChangeData&lt;br /&gt;
 QSGFlatColorMaterial&lt;br /&gt;
 QSGImageNode&lt;br /&gt;
 QSGMaterial&lt;br /&gt;
 QSGMaterialShader&lt;br /&gt;
 QSGMaterialShader.RenderState&lt;br /&gt;
 QSGOpaqueTextureMaterial&lt;br /&gt;
 QSGRectangleNode&lt;br /&gt;
 QSGRenderNode&lt;br /&gt;
 QSGRendererInterface&lt;br /&gt;
 QSGSimpleMaterial&lt;br /&gt;
 QSGSimpleMaterialShader&lt;br /&gt;
 QSGTextureMaterial&lt;br /&gt;
 QSGVertexColorMaterial&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 14&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSql =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtsql-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtSql for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtSql:&#039;&#039;&#039; 15&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtTest =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qttest-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtTest for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtTest:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtTest:&lt;br /&gt;
&lt;br /&gt;
 QAbstractItemModelTester&lt;br /&gt;
 QSignalSpy&lt;br /&gt;
 QTestEventList&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWidgets =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtwidgets-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtWidgets for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWidgets:&#039;&#039;&#039; 200&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtWidgets:&lt;br /&gt;
&lt;br /&gt;
 QAccessibleWidget&lt;br /&gt;
 QFormLayout.TakeRowResult&lt;br /&gt;
 QMacCocoaViewContainer&lt;br /&gt;
 QMacNativeWidget&lt;br /&gt;
 QProxyStyle&lt;br /&gt;
 QScroller&lt;br /&gt;
 QScrollerProperties&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 7&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DCore =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt3dcore-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DCore for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DCore:&#039;&#039;&#039; 37&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in Qt3DCore:&lt;br /&gt;
&lt;br /&gt;
 Qt3DCore.QBackendNodeMapper&lt;br /&gt;
 Qt3DCore.QNodeCreatedChange&lt;br /&gt;
 Qt3DCore.Quick&lt;br /&gt;
 Qt3DCore.Quick.QQmlAspectEngine&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DInput =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt3dinput-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DInput for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DInput:&#039;&#039;&#039; 24&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in Qt3DInput:&lt;br /&gt;
&lt;br /&gt;
 Qt3DInput.QPhysicalDeviceCreatedChangeBase&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DLogic =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt3dlogic-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DLogic for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DLogic:&#039;&#039;&#039; 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DRender =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt3drender-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DRender for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DRender:&#039;&#039;&#039; 110&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DAnimation =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt3danimation-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DAnimation for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DAnimation:&#039;&#039;&#039; 23&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in Qt3DAnimation:&lt;br /&gt;
&lt;br /&gt;
 Qt3DAnimation.QAnimationClip&lt;br /&gt;
 Qt3DAnimation.QAnimationClipData&lt;br /&gt;
 Qt3DAnimation.QAnimationClipLoader&lt;br /&gt;
 Qt3DAnimation.QCallbackMapping&lt;br /&gt;
 Qt3DAnimation.QChannelMapper&lt;br /&gt;
 Qt3DAnimation.QChannelMapping&lt;br /&gt;
 Qt3DAnimation.QClipBlendValue&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 7&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DExtras =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt3dextras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DExtras for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DExtras:&#039;&#039;&#039; 46&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtConcurrent =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtconcurrent-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtConcurrent for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtConcurrent:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtNetworkAuth =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtnetworkauth-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtNetworkAuth. Received error: module PySide2 has no attribute QtNetworkAuth. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtHelp =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qthelp-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtHelp for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtHelp:&#039;&#039;&#039; 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtLocation =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtlocation-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtLocation for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtLocation:&#039;&#039;&#039; 40&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtLocation:&lt;br /&gt;
&lt;br /&gt;
 QLocation&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtPrintSupport =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtprintsupport-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtPrintSupport for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtPrintSupport:&#039;&#039;&#039; 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSCXML =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtscxml-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtSCXML. Received error: module PySide2 has no attribute QtSCXML. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSpeech =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtspeech-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtSpeech. Received error: module PySide2 has no attribute QtSpeech. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSvg =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtsvg-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtSvg for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtSvg:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtUiTools =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtuitools-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtUiTools for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtUiTools:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebChannel =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtwebchannel-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtWebChannel for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebChannel:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebEngine =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtwebengine-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtWebEngine. Received error: module PySide2 has no attribute QtWebEngine. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebEngineWidgets =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtwebenginewidgets-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtWebEngineWidgets for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebEngineWidgets:&#039;&#039;&#039; 12&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtWebEngineWidgets:&lt;br /&gt;
&lt;br /&gt;
 QWebEngineContextMenuData&lt;br /&gt;
 QWebEngineFullScreenRequest&lt;br /&gt;
 QWebEngineHistory&lt;br /&gt;
 QWebEngineScriptCollection&lt;br /&gt;
 QWebEngineSettings&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebSockets =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtwebsockets-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtWebSockets for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebSockets:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMacExtras =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtmacextras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtMacExtras. Received error: module PySide2 has no attribute QtMacExtras. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtX11Extras =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtx11extras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtX11Extras for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtX11Extras:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWinExtras =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtwinextras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtWinExtras. Received error: module PySide2 has no attribute QtWinExtras. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtXml =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtxml-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtXml for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtXml:&#039;&#039;&#039; 31&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtXmlPatterns =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtxmlpatterns-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtXmlPatterns for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtXmlPatterns:&#039;&#039;&#039; 15&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtXmlPatterns:&lt;br /&gt;
&lt;br /&gt;
 QSimpleXmlNodeModel&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtCharts =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qt-charts-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtCharts for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtCharts:&#039;&#039;&#039; 48&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtCharts:&lt;br /&gt;
&lt;br /&gt;
 QAbstractAxis&lt;br /&gt;
 QAbstractBarSeries&lt;br /&gt;
 QAbstractSeries&lt;br /&gt;
 QAreaLegendMarker&lt;br /&gt;
 QAreaSeries&lt;br /&gt;
 QBarCategoryAxis&lt;br /&gt;
 QBarLegendMarker&lt;br /&gt;
 QBarSeries&lt;br /&gt;
 QBarSet&lt;br /&gt;
 QBoxPlotLegendMarker&lt;br /&gt;
 QBoxPlotSeries&lt;br /&gt;
 QBoxSet&lt;br /&gt;
 QCandlestickLegendMarker&lt;br /&gt;
 QCandlestickModelMapper&lt;br /&gt;
 QCandlestickSeries&lt;br /&gt;
 QCandlestickSet&lt;br /&gt;
 QCategoryAxis&lt;br /&gt;
 QChart&lt;br /&gt;
 QChartView&lt;br /&gt;
 QDateTimeAxis&lt;br /&gt;
 QHBarModelMapper&lt;br /&gt;
 QHBoxPlotModelMapper&lt;br /&gt;
 QHCandlestickModelMapper&lt;br /&gt;
 QHPieModelMapper&lt;br /&gt;
 QHXYModelMapper&lt;br /&gt;
 QHorizontalBarSeries&lt;br /&gt;
 QHorizontalPercentBarSeries&lt;br /&gt;
 QHorizontalStackedBarSeries&lt;br /&gt;
 QLegend&lt;br /&gt;
 QLegendMarker&lt;br /&gt;
 QLineSeries&lt;br /&gt;
 QLogValueAxis&lt;br /&gt;
 QPercentBarSeries&lt;br /&gt;
 QPieLegendMarker&lt;br /&gt;
 QPieSeries&lt;br /&gt;
 QPieSlice&lt;br /&gt;
 QPolarChart&lt;br /&gt;
 QScatterSeries&lt;br /&gt;
 QSplineSeries&lt;br /&gt;
 QStackedBarSeries&lt;br /&gt;
 QVBarModelMapper&lt;br /&gt;
 QVBoxPlotModelMapper&lt;br /&gt;
 QVCandlestickModelMapper&lt;br /&gt;
 QVPieModelMapper&lt;br /&gt;
 QVXYModelMapper&lt;br /&gt;
 QValueAxis&lt;br /&gt;
 QXYLegendMarker&lt;br /&gt;
 QXYSeries&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 48&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtDataVisualization =====&lt;br /&gt;
Documentation link: http://doc-snapshots.qt.io/qt5-5.11/qtdatavisualization-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtDataVisualization for comparison. Received error: No module named PyQt5.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtDataVisualization:&#039;&#039;&#039; 36&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtDataVisualization:&lt;br /&gt;
&lt;br /&gt;
 Q3DBars&lt;br /&gt;
 Q3DCamera&lt;br /&gt;
 Q3DInputHandler&lt;br /&gt;
 Q3DLight&lt;br /&gt;
 Q3DObject&lt;br /&gt;
 Q3DScatter&lt;br /&gt;
 Q3DScene&lt;br /&gt;
 Q3DSurface&lt;br /&gt;
 Q3DTheme&lt;br /&gt;
 QAbstract3DAxis&lt;br /&gt;
 QAbstract3DGraph&lt;br /&gt;
 QAbstract3DInputHandler&lt;br /&gt;
 QAbstract3DSeries&lt;br /&gt;
 QAbstractDataProxy&lt;br /&gt;
 QBar3DSeries&lt;br /&gt;
 QBarDataItem&lt;br /&gt;
 QBarDataProxy&lt;br /&gt;
 QCategory3DAxis&lt;br /&gt;
 QCustom3DItem&lt;br /&gt;
 QCustom3DLabel&lt;br /&gt;
 QCustom3DVolume&lt;br /&gt;
 QHeightMapSurfaceDataProxy&lt;br /&gt;
 QItemModelBarDataProxy&lt;br /&gt;
 QItemModelScatterDataProxy&lt;br /&gt;
 QItemModelSurfaceDataProxy&lt;br /&gt;
 QLogValue3DAxisFormatter&lt;br /&gt;
 QScatter3DSeries&lt;br /&gt;
 QScatterDataItem&lt;br /&gt;
 QScatterDataProxy&lt;br /&gt;
 QSurface3DSeries&lt;br /&gt;
 QSurfaceDataItem&lt;br /&gt;
 QSurfaceDataProxy&lt;br /&gt;
 QTouch3DInputHandler&lt;br /&gt;
 QValue3DAxis&lt;br /&gt;
 QValue3DAxisFormatter&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 35&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Summary =====&lt;br /&gt;
Total number of missing types:&#039;&#039;&#039; 219&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Total number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Total number of missing modules:&#039;&#039;&#039; 6&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= PySide2 bindings for Qt 5.9 =&lt;br /&gt;
Using Qt version 5.9 documentation to find public API Qt types and test if the types are present in the PySide2 package.&lt;br /&gt;
Similar report:&lt;br /&gt;
https://gist.github.com/ethanhs/6c626ca4e291f3682589699296377d3a&lt;br /&gt;
&lt;br /&gt;
This report was generated by running the following command:&lt;br /&gt;
 python missing_bindings.py --qt-version 5.9 -w all&lt;br /&gt;
on the following date:&lt;br /&gt;
 2018-05-22 11:03:26 GMT&lt;br /&gt;
&lt;br /&gt;
===== QtCore =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtcore-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtCore:&#039;&#039;&#039; 169&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtCore:&lt;br /&gt;
&lt;br /&gt;
 QAbstractNativeEventFilter (is present in PyQt5)&lt;br /&gt;
 QAtomicInt&lt;br /&gt;
 QAtomicInteger&lt;br /&gt;
 QAtomicPointer&lt;br /&gt;
 QByteArrayList&lt;br /&gt;
 QCache&lt;br /&gt;
 QContiguousCache&lt;br /&gt;
 QDeadlineTimer (is present in PyQt5)&lt;br /&gt;
 QEventLoopLocker (is present in PyQt5)&lt;br /&gt;
 QException&lt;br /&gt;
 QFuture&lt;br /&gt;
 QFutureSynchronizer&lt;br /&gt;
 QFutureWatcher&lt;br /&gt;
 QJsonObject&lt;br /&gt;
 QLibrary (is present in PyQt5)&lt;br /&gt;
 QLoggingCategory&lt;br /&gt;
 QMessageLogger (is present in PyQt5)&lt;br /&gt;
 QMetaType (is present in PyQt5)&lt;br /&gt;
 QObjectCleanupHandler (is present in PyQt5)&lt;br /&gt;
 QSharedMemory (is present in PyQt5)&lt;br /&gt;
 QStaticByteArrayMatcher&lt;br /&gt;
 QThreadStorage&lt;br /&gt;
 QUnhandledException&lt;br /&gt;
 QVariant (is present in PyQt5)&lt;br /&gt;
 QWinEventNotifier&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 25&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 9&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtGui =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtgui-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtGui:&#039;&#039;&#039; 189&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtGui:&lt;br /&gt;
&lt;br /&gt;
 QAccessibleImageInterface&lt;br /&gt;
 QGlyphRun (is present in PyQt5)&lt;br /&gt;
 QIconEngine.ScaledPixmapArgument (is present in PyQt5)&lt;br /&gt;
 QOpenGLPaintDevice (is present in PyQt5)&lt;br /&gt;
 QPlatformSurfaceEvent (is present in PyQt5)&lt;br /&gt;
 QRasterPaintEngine&lt;br /&gt;
 QRgba64 (is present in PyQt5)&lt;br /&gt;
 QSupportedWritingSystems&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMultimedia =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtmultimedia-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtMultimedia:&#039;&#039;&#039; 94&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtMultimedia:&lt;br /&gt;
&lt;br /&gt;
 QAbstractPlanarVideoBuffer&lt;br /&gt;
 QAudioBuffer.StereoFrame&lt;br /&gt;
 QAudioSystemPlugin&lt;br /&gt;
 QCameraExposure (is present in PyQt5)&lt;br /&gt;
 QCameraFlashControl&lt;br /&gt;
 QCameraFocus (is present in PyQt5)&lt;br /&gt;
 QCameraFocusControl&lt;br /&gt;
 QCameraImageProcessing (is present in PyQt5)&lt;br /&gt;
 QMediaMetaData (is present in PyQt5)&lt;br /&gt;
 QMediaServiceProviderPlugin&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 10&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMultimediaWidgets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtmultimediawidgets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtMultimediaWidgets:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtNetwork =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtnetwork-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtNetwork:&#039;&#039;&#039; 48&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtNetwork:&lt;br /&gt;
&lt;br /&gt;
 QSctpServer&lt;br /&gt;
 QSctpSocket&lt;br /&gt;
 QSslEllipticCurve (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtQml =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtqml-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtQml:&#039;&#039;&#039; 23&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtQml:&lt;br /&gt;
&lt;br /&gt;
 QQmlListProperty (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtQuick =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtquick-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtQuick:&#039;&#039;&#039; 45&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtQuick:&lt;br /&gt;
&lt;br /&gt;
 QQuickItem.ItemChangeData (is present in PyQt5)&lt;br /&gt;
 QSGFlatColorMaterial (is present in PyQt5)&lt;br /&gt;
 QSGImageNode (is present in PyQt5)&lt;br /&gt;
 QSGMaterial (is present in PyQt5)&lt;br /&gt;
 QSGMaterialShader (is present in PyQt5)&lt;br /&gt;
 QSGMaterialShader.RenderState (is present in PyQt5)&lt;br /&gt;
 QSGOpaqueTextureMaterial (is present in PyQt5)&lt;br /&gt;
 QSGRectangleNode (is present in PyQt5)&lt;br /&gt;
 QSGRenderNode (is present in PyQt5)&lt;br /&gt;
 QSGRendererInterface (is present in PyQt5)&lt;br /&gt;
 QSGSimpleMaterial&lt;br /&gt;
 QSGSimpleMaterialShader&lt;br /&gt;
 QSGTextureMaterial (is present in PyQt5)&lt;br /&gt;
 QSGVertexColorMaterial (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 14&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 12&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSql =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtsql-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtSql:&#039;&#039;&#039; 15&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtTest =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qttest-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtTest:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtTest:&lt;br /&gt;
&lt;br /&gt;
 QSignalSpy (is present in PyQt5)&lt;br /&gt;
 QTestEventList&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWidgets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtwidgets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWidgets:&#039;&#039;&#039; 201&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtWidgets:&lt;br /&gt;
&lt;br /&gt;
 QFormLayout.TakeRowResult (is present in PyQt5)&lt;br /&gt;
 QMacCocoaViewContainer&lt;br /&gt;
 QMacNativeWidget&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DCore =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt3dcore-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DCore for comparison. Received error: module PyQt5 has no attribute Qt3DCore.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DCore:&#039;&#039;&#039; 31&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in Qt3DCore:&lt;br /&gt;
&lt;br /&gt;
 Qt3DCore.QBackendNodeMapper&lt;br /&gt;
 Qt3DCore.QNodeCreatedChange&lt;br /&gt;
 Qt3DCore.Quick&lt;br /&gt;
 Qt3DCore.Quick.QQmlAspectEngine&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DInput =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt3dinput-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DInput for comparison. Received error: module PyQt5 has no attribute Qt3DInput.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DInput:&#039;&#039;&#039; 23&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DLogic =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt3dlogic-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DLogic for comparison. Received error: module PyQt5 has no attribute Qt3DLogic.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DLogic:&#039;&#039;&#039; 3&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DRender =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt3drender-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DRender for comparison. Received error: module PyQt5 has no attribute Qt3DRender.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DRender:&#039;&#039;&#039; 100&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in Qt3DRender:&lt;br /&gt;
&lt;br /&gt;
 Qt3DRender.AssimpImporter&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DAnimation =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt3danimation-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DAnimation for comparison. Received error: module PyQt5 has no attribute Qt3DAnimation.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DAnimation:&#039;&#039;&#039; 16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Qt3DExtras =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt3dextras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.Qt3DExtras for comparison. Received error: module PyQt5 has no attribute Qt3DExtras.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in Qt3DExtras:&#039;&#039;&#039; 32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in Qt3DExtras:&lt;br /&gt;
&lt;br /&gt;
 Qt3DExtras.QNormalDiffuseMapAlphaMaterial&lt;br /&gt;
 Qt3DExtras.QTexturedMetalRoughMaterial&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtConcurrent =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtconcurrent-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtConcurrent for comparison. Received error: module PyQt5 has no attribute QtConcurrent.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtConcurrent:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtNetworkAuth =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtnetworkauth-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtNetworkAuth. Received error: module PySide2 has no attribute QtNetworkAuth. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtHelp =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qthelp-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtHelp:&#039;&#039;&#039; 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtLocation =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtlocation-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtLocation:&#039;&#039;&#039; 40&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtLocation:&lt;br /&gt;
&lt;br /&gt;
 QLocation (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtPrintSupport =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtprintsupport-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtPrintSupport:&#039;&#039;&#039; 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSCXML =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtscxml-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtSCXML. Received error: module PySide2 has no attribute QtSCXML. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSpeech =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtspeech-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtSpeech. Received error: module PySide2 has no attribute QtSpeech. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSvg =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtsvg-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtSvg:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtUiTools =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtuitools-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtUiTools for comparison. Received error: module PyQt5 has no attribute QtUiTools.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtUiTools:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebChannel =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtwebchannel-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebChannel:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebEngine =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtwebengine-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtWebEngine. Received error: module PySide2 has no attribute QtWebEngine. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebEngineWidgets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtwebenginewidgets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebEngineWidgets:&#039;&#039;&#039; 12&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtWebEngineWidgets:&lt;br /&gt;
&lt;br /&gt;
 QWebEngineContextMenuData (is present in PyQt5)&lt;br /&gt;
 QWebEngineFullScreenRequest (is present in PyQt5)&lt;br /&gt;
 QWebEngineHistory (is present in PyQt5)&lt;br /&gt;
 QWebEngineScriptCollection (is present in PyQt5)&lt;br /&gt;
 QWebEngineSettings (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebSockets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtwebsockets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebSockets:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMacExtras =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtmacextras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtMacExtras. Received error: module PySide2 has no attribute QtMacExtras. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtX11Extras =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtx11extras-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtX11Extras:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWinExtras =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtwinextras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtWinExtras. Received error: module PySide2 has no attribute QtWinExtras. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtXml =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtxml-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtXml:&#039;&#039;&#039; 31&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtXmlPatterns =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtxmlpatterns-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtXmlPatterns:&#039;&#039;&#039; 16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtXmlPatterns:&lt;br /&gt;
&lt;br /&gt;
 QSimpleXmlNodeModel (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtCharts =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qt-charts-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtCharts for comparison. Received error: module PyQt5 has no attribute QtCharts.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtCharts:&#039;&#039;&#039; 48&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtCharts:&lt;br /&gt;
&lt;br /&gt;
 QAbstractAxis&lt;br /&gt;
 QAbstractBarSeries&lt;br /&gt;
 QAbstractSeries&lt;br /&gt;
 QAreaLegendMarker&lt;br /&gt;
 QAreaSeries&lt;br /&gt;
 QBarCategoryAxis&lt;br /&gt;
 QBarLegendMarker&lt;br /&gt;
 QBarSeries&lt;br /&gt;
 QBarSet&lt;br /&gt;
 QBoxPlotLegendMarker&lt;br /&gt;
 QBoxPlotSeries&lt;br /&gt;
 QBoxSet&lt;br /&gt;
 QCandlestickLegendMarker&lt;br /&gt;
 QCandlestickModelMapper&lt;br /&gt;
 QCandlestickSeries&lt;br /&gt;
 QCandlestickSet&lt;br /&gt;
 QCategoryAxis&lt;br /&gt;
 QChart&lt;br /&gt;
 QChartView&lt;br /&gt;
 QDateTimeAxis&lt;br /&gt;
 QHBarModelMapper&lt;br /&gt;
 QHBoxPlotModelMapper&lt;br /&gt;
 QHCandlestickModelMapper&lt;br /&gt;
 QHPieModelMapper&lt;br /&gt;
 QHXYModelMapper&lt;br /&gt;
 QHorizontalBarSeries&lt;br /&gt;
 QHorizontalPercentBarSeries&lt;br /&gt;
 QHorizontalStackedBarSeries&lt;br /&gt;
 QLegend&lt;br /&gt;
 QLegendMarker&lt;br /&gt;
 QLineSeries&lt;br /&gt;
 QLogValueAxis&lt;br /&gt;
 QPercentBarSeries&lt;br /&gt;
 QPieLegendMarker&lt;br /&gt;
 QPieSeries&lt;br /&gt;
 QPieSlice&lt;br /&gt;
 QPolarChart&lt;br /&gt;
 QScatterSeries&lt;br /&gt;
 QSplineSeries&lt;br /&gt;
 QStackedBarSeries&lt;br /&gt;
 QVBarModelMapper&lt;br /&gt;
 QVBoxPlotModelMapper&lt;br /&gt;
 QVCandlestickModelMapper&lt;br /&gt;
 QVPieModelMapper&lt;br /&gt;
 QVXYModelMapper&lt;br /&gt;
 QValueAxis&lt;br /&gt;
 QXYLegendMarker&lt;br /&gt;
 QXYSeries&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 48&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtDataVisualization =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.9/qtdatavisualization-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtDataVisualization for comparison. Received error: module PyQt5 has no attribute QtDataVisualization.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtDataVisualization:&#039;&#039;&#039; 36&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtDataVisualization:&lt;br /&gt;
&lt;br /&gt;
 Q3DBars&lt;br /&gt;
 Q3DCamera&lt;br /&gt;
 Q3DInputHandler&lt;br /&gt;
 Q3DLight&lt;br /&gt;
 Q3DObject&lt;br /&gt;
 Q3DScatter&lt;br /&gt;
 Q3DScene&lt;br /&gt;
 Q3DSurface&lt;br /&gt;
 Q3DTheme&lt;br /&gt;
 QAbstract3DAxis&lt;br /&gt;
 QAbstract3DGraph&lt;br /&gt;
 QAbstract3DInputHandler&lt;br /&gt;
 QAbstract3DSeries&lt;br /&gt;
 QAbstractDataProxy&lt;br /&gt;
 QBar3DSeries&lt;br /&gt;
 QBarDataItem&lt;br /&gt;
 QBarDataProxy&lt;br /&gt;
 QCategory3DAxis&lt;br /&gt;
 QCustom3DItem&lt;br /&gt;
 QCustom3DLabel&lt;br /&gt;
 QCustom3DVolume&lt;br /&gt;
 QHeightMapSurfaceDataProxy&lt;br /&gt;
 QItemModelBarDataProxy&lt;br /&gt;
 QItemModelScatterDataProxy&lt;br /&gt;
 QItemModelSurfaceDataProxy&lt;br /&gt;
 QLogValue3DAxisFormatter&lt;br /&gt;
 QScatter3DSeries&lt;br /&gt;
 QScatterDataItem&lt;br /&gt;
 QScatterDataProxy&lt;br /&gt;
 QSurface3DSeries&lt;br /&gt;
 QSurfaceDataItem&lt;br /&gt;
 QSurfaceDataProxy&lt;br /&gt;
 QTouch3DInputHandler&lt;br /&gt;
 QValue3DAxis&lt;br /&gt;
 QValue3DAxisFormatter&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 35&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Summary =====&lt;br /&gt;
Total number of missing types:&#039;&#039;&#039; 163&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Total number of missing types that are present in PyQt5:&#039;&#039;&#039; 41&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Total number of missing modules:&#039;&#039;&#039; 6&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Stalled version =&lt;br /&gt;
== PySide2 bindings for Qt 5.6 ==&lt;br /&gt;
&lt;br /&gt;
Using Qt version 5.6 documentation to find public API Qt types, to test if they are present in PySide2.&lt;br /&gt;
&lt;br /&gt;
Similar report: https://gist.github.com/ethanhs/6c626ca4e291f3682589699296377d3a&lt;br /&gt;
&lt;br /&gt;
This report was generated by running the following command:&lt;br /&gt;
 python missing_bindings.py --qt-version 5.6 -w all&lt;br /&gt;
on the following date:&lt;br /&gt;
 2017-09-04 08:38:07 CET&lt;br /&gt;
&lt;br /&gt;
===== QtCore =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtcore-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtCore:&#039;&#039;&#039; 166&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtCore:&lt;br /&gt;
&lt;br /&gt;
 QAbstractNativeEventFilter (is present in PyQt5)&lt;br /&gt;
 QAtomicInt&lt;br /&gt;
 QAtomicInteger&lt;br /&gt;
 QAtomicPointer&lt;br /&gt;
 QByteArrayList&lt;br /&gt;
 QCache&lt;br /&gt;
 QContiguousCache&lt;br /&gt;
 QEventLoopLocker (is present in PyQt5)&lt;br /&gt;
 QException&lt;br /&gt;
 QFuture&lt;br /&gt;
 QFutureSynchronizer&lt;br /&gt;
 QFutureWatcher&lt;br /&gt;
 QIdentityProxyModel (is present in PyQt5)&lt;br /&gt;
 QJsonObject&lt;br /&gt;
 QLibrary (is present in PyQt5)&lt;br /&gt;
 QLockFile (is present in PyQt5)&lt;br /&gt;
 QLoggingCategory&lt;br /&gt;
 QMessageAuthenticationCode (is present in PyQt5)&lt;br /&gt;
 QMessageLogger (is present in PyQt5)&lt;br /&gt;
 QMetaType (is present in PyQt5)&lt;br /&gt;
 QObjectCleanupHandler (is present in PyQt5)&lt;br /&gt;
 QRegularExpression (is present in PyQt5)&lt;br /&gt;
 QRegularExpressionMatch (is present in PyQt5)&lt;br /&gt;
 QRegularExpressionMatchIterator (is present in PyQt5)&lt;br /&gt;
 QSharedMemory (is present in PyQt5)&lt;br /&gt;
 QSignalBlocker (is present in PyQt5)&lt;br /&gt;
 QStringListModel (is present in PyQt5)&lt;br /&gt;
 QThreadStorage&lt;br /&gt;
 QUnhandledException&lt;br /&gt;
 QUrlQuery (is present in PyQt5)&lt;br /&gt;
 QUuid (is present in PyQt5)&lt;br /&gt;
 QVariant (is present in PyQt5)&lt;br /&gt;
 QVersionNumber (is present in PyQt5)&lt;br /&gt;
 QWinEventNotifier&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 34&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 19&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtGui =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtgui-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtGui:&#039;&#039;&#039; 188&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtGui:&lt;br /&gt;
&lt;br /&gt;
 QAbstractOpenGLFunctions (is present in PyQt5)&lt;br /&gt;
 QAccessibleEditableTextInterface&lt;br /&gt;
 QAccessibleImageInterface&lt;br /&gt;
 QAccessibleObject&lt;br /&gt;
 QAccessibleStateChangeEvent&lt;br /&gt;
 QAccessibleTableCellInterface&lt;br /&gt;
 QAccessibleTableModelChangeEvent&lt;br /&gt;
 QAccessibleTextCursorEvent&lt;br /&gt;
 QAccessibleTextInsertEvent&lt;br /&gt;
 QAccessibleTextInterface&lt;br /&gt;
 QAccessibleTextRemoveEvent&lt;br /&gt;
 QAccessibleTextSelectionEvent&lt;br /&gt;
 QAccessibleTextUpdateEvent&lt;br /&gt;
 QAccessibleValueChangeEvent&lt;br /&gt;
 QAccessibleValueInterface&lt;br /&gt;
 QGlyphRun (is present in PyQt5)&lt;br /&gt;
 QInputMethod (is present in PyQt5)&lt;br /&gt;
 QInputMethodQueryEvent (is present in PyQt5)&lt;br /&gt;
 QNativeGestureEvent (is present in PyQt5)&lt;br /&gt;
 QOffscreenSurface (is present in PyQt5)&lt;br /&gt;
 QOpenGLContextGroup (is present in PyQt5)&lt;br /&gt;
 QOpenGLDebugLogger (is present in PyQt5)&lt;br /&gt;
 QOpenGLDebugMessage (is present in PyQt5)&lt;br /&gt;
 QOpenGLFramebufferObjectFormat (is present in PyQt5)&lt;br /&gt;
 QOpenGLPaintDevice (is present in PyQt5)&lt;br /&gt;
 QOpenGLShaderProgram (is present in PyQt5)&lt;br /&gt;
 QOpenGLTexture (is present in PyQt5)&lt;br /&gt;
 QOpenGLTimeMonitor (is present in PyQt5)&lt;br /&gt;
 QOpenGLTimerQuery (is present in PyQt5)&lt;br /&gt;
 QOpenGLVersionProfile (is present in PyQt5)&lt;br /&gt;
 QOpenGLVertexArrayObject (is present in PyQt5)&lt;br /&gt;
 QOpenGLVertexArrayObject.Binder (is present in PyQt5)&lt;br /&gt;
 QOpenGLWindow (is present in PyQt5)&lt;br /&gt;
 QPlatformGraphicsBuffer&lt;br /&gt;
 QPlatformSurfaceEvent (is present in PyQt5)&lt;br /&gt;
 QPlatformSystemTrayIcon&lt;br /&gt;
 QRasterPaintEngine&lt;br /&gt;
 QRgba64 (is present in PyQt5)&lt;br /&gt;
 QScrollEvent (is present in PyQt5)&lt;br /&gt;
 QScrollPrepareEvent (is present in PyQt5)&lt;br /&gt;
 QSupportedWritingSystems&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 41&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 23&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWidgets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtwidgets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWidgets:&#039;&#039;&#039; 200&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtWidgets:&lt;br /&gt;
&lt;br /&gt;
 QAccessibleWidget&lt;br /&gt;
 QColormap&lt;br /&gt;
 QMacCocoaViewContainer (is present in PyQt5)&lt;br /&gt;
 QMacNativeWidget&lt;br /&gt;
 QProxyStyle (is present in PyQt5)&lt;br /&gt;
 QScroller (is present in PyQt5)&lt;br /&gt;
 QScrollerProperties (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 7&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMultimedia =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtmultimedia-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtMultimedia:&#039;&#039;&#039; 90&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtMultimedia:&lt;br /&gt;
&lt;br /&gt;
 QAbstractPlanarVideoBuffer&lt;br /&gt;
 QAudioBuffer.StereoFrame&lt;br /&gt;
 QCameraExposure (is present in PyQt5)&lt;br /&gt;
 QCameraFeedbackControl&lt;br /&gt;
 QCameraFlashControl&lt;br /&gt;
 QCameraFocus (is present in PyQt5)&lt;br /&gt;
 QCameraFocusControl&lt;br /&gt;
 QCameraImageProcessing (is present in PyQt5)&lt;br /&gt;
 QMediaMetaData (is present in PyQt5)&lt;br /&gt;
 QMediaService (is present in PyQt5)&lt;br /&gt;
 QMediaServiceCameraInfoInterface&lt;br /&gt;
 QMediaServiceDefaultDeviceInterface&lt;br /&gt;
 QMediaServiceFeaturesInterface&lt;br /&gt;
 QMediaServiceProviderPlugin&lt;br /&gt;
 QMediaServiceSupportedDevicesInterface&lt;br /&gt;
 QMediaServiceSupportedFormatsInterface&lt;br /&gt;
 QMediaStreamsControl&lt;br /&gt;
 QMediaTimeInterval (is present in PyQt5)&lt;br /&gt;
 QMediaVideoProbeControl&lt;br /&gt;
 QMetaDataReaderControl&lt;br /&gt;
 QMetaDataWriterControl&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 6&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtMultimediaWidgets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtmultimediawidgets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtMultimediaWidgets:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtNetwork =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtnetwork-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtNetwork:&#039;&#039;&#039; 43&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtNetwork:&lt;br /&gt;
&lt;br /&gt;
 QDnsDomainNameRecord (is present in PyQt5)&lt;br /&gt;
 QDnsHostAddressRecord (is present in PyQt5)&lt;br /&gt;
 QDnsLookup (is present in PyQt5)&lt;br /&gt;
 QDnsMailExchangeRecord (is present in PyQt5)&lt;br /&gt;
 QDnsServiceRecord (is present in PyQt5)&lt;br /&gt;
 QDnsTextRecord (is present in PyQt5)&lt;br /&gt;
 QHttpMultiPart (is present in PyQt5)&lt;br /&gt;
 QHttpPart (is present in PyQt5)&lt;br /&gt;
 QSslCertificateExtension (is present in PyQt5)&lt;br /&gt;
 QSslEllipticCurve (is present in PyQt5)&lt;br /&gt;
 QSslPreSharedKeyAuthenticator (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtQml =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtqml-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtQml:&#039;&#039;&#039; 23&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtQml:&lt;br /&gt;
&lt;br /&gt;
 QQmlListProperty (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtQuick =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtquick-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtQuick:&#039;&#039;&#039; 43&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtQuick:&lt;br /&gt;
&lt;br /&gt;
 QQuickItem.ItemChangeData (is present in PyQt5)&lt;br /&gt;
 QSGFlatColorMaterial (is present in PyQt5)&lt;br /&gt;
 QSGMaterial (is present in PyQt5)&lt;br /&gt;
 QSGMaterialShader (is present in PyQt5)&lt;br /&gt;
 QSGMaterialShader.RenderState (is present in PyQt5)&lt;br /&gt;
 QSGOpaqueTextureMaterial (is present in PyQt5)&lt;br /&gt;
 QSGSimpleMaterial&lt;br /&gt;
 QSGSimpleMaterialShader&lt;br /&gt;
 QSGTextureMaterial (is present in PyQt5)&lt;br /&gt;
 QSGVertexColorMaterial (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 10&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSql =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtsql-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtSql:&#039;&#039;&#039; 15&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtTest =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qttest-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtTest:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtTest:&lt;br /&gt;
&lt;br /&gt;
 QSignalSpy (is present in PyQt5)&lt;br /&gt;
 QTestEventList&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtConcurrent =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtconcurrent-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtConcurrent for comparison. Received error: module object has no attribute QtConcurrent &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtConcurrent:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtHelp =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qthelp-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtHelp. Received error: module object has no attribute QtHelp. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtOpenGL =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtopengl-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtOpenGL:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtLocation =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtlocation-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtLocation. Received error: module object has no attribute QtLocation. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtPrintSupport =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtprintsupport-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtPrintSupport:&#039;&#039;&#039; 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtScript =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtscript-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtScript for comparison. Received error: module object has no attribute QtScript &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtScript:&#039;&#039;&#039; 13&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtScript:&lt;br /&gt;
&lt;br /&gt;
 QScriptSyntaxCheckResult&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtScriptTools =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtscripttools-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PyQt5.QtScriptTools for comparison. Received error: module object has no attribute QtScriptTools &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of types in QtScriptTools:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtSvg =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtsvg-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtSvg:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtUiTools =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtuitools-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtUiTools. Received error: module object has no attribute QtUiTools. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebChannel =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtwebchannel-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebChannel:&#039;&#039;&#039; 2&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebEngineWidgets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtwebenginewidgets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebEngineWidgets:&#039;&#039;&#039; 11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtWebEngineWidgets:&lt;br /&gt;
&lt;br /&gt;
 QWebEngineFullScreenRequest (is present in PyQt5)&lt;br /&gt;
 QWebEngineHistory (is present in PyQt5)&lt;br /&gt;
 QWebEngineScriptCollection (is present in PyQt5)&lt;br /&gt;
 QWebEngineSettings (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtWebSockets =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtwebsockets-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtWebSockets:&#039;&#039;&#039; 5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtX11Extras =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtx11extras-module.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Could not load PySide2.QtX11Extras. Received error: module object has no attribute QtX11Extras. Skipping.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtXml =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtxml-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtXml:&#039;&#039;&#039; 31&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== QtXmlPatterns =====&lt;br /&gt;
Documentation link: http://doc.qt.io/qt-5.6/qtxmlpatterns-module.html&lt;br /&gt;
&lt;br /&gt;
Number of types in QtXmlPatterns:&#039;&#039;&#039; 16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Missing types in QtXmlPatterns:&lt;br /&gt;
&lt;br /&gt;
 QSimpleXmlNodeModel (is present in PyQt5)&lt;br /&gt;
&lt;br /&gt;
Number of missing types:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Number of missing types that are present in PyQt5:&#039;&#039;&#039; 1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===== Summary =====&lt;br /&gt;
Total number of missing types:&#039;&#039;&#039; 133&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Total number of missing types that are present in PyQt5:&#039;&#039;&#039; 78&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Total number of missing modules:&#039;&#039;&#039; 4&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/pt&amp;diff=33837</id>
		<title>Qt for Python/pt</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/pt&amp;diff=33837"/>
		<updated>2018-05-27T15:13:17Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LangSwitch}}&lt;br /&gt;
[[Category:Qt for Python]]&lt;br /&gt;
== Qt para Python ==&lt;br /&gt;
&lt;br /&gt;
O Projeto PySide2 tem como objetivo portar completamente o [[PySide]] para Qt 5.x. O desenvolvimento iniciou no [https://github.com/PySide GitHub] em Maio de 2015. O projeto conseguiu portar o PySide para o Qt 5.3, 5.4 e 5.5. Durante o mês de abril de 2016, a The Qt Company decidiu fornecer apoio adequado ao projeto (ver [https://groups.google.com/forum/#!topic/pyside-dev/pqwzngAGLWE detalhes]).&lt;br /&gt;
&lt;br /&gt;
Esta página wiki acompanha o progresso do desenvolvimento do PySide para Qt 5.x e fornece mais informações sobre o esforço.&lt;br /&gt;
&lt;br /&gt;
== Primeiros passos ==&lt;br /&gt;
&lt;br /&gt;
* [[PySide2_GettingStarted|Guia dos Primeiros passospara macOS, Windows e Linux]]&lt;br /&gt;
* [https://bugreports.qt.io/browse/PYSIDE Bug tracker] para reportar qualquer problema.&lt;br /&gt;
* [https://codereview.qt-project.org CodeReview] e [https://codereview.qt-project.org/#/q/project:%255Epyside.%252B,n,z PySide2 remendos abertos] &lt;br /&gt;
* Repositório Git (Ramo 5.9 é o ramo atualmente em trabalho no PySide2)&lt;br /&gt;
** ssh://codereview.qt-project.org/pyside/pyside-setup &lt;br /&gt;
* [[PySide2_Development_Getting_Started|Desenvolvimento: Primeiros passos]]&lt;br /&gt;
&lt;br /&gt;
== Comunidade ==&lt;br /&gt;
&lt;br /&gt;
* Canal oficial IRC no FreeNode &#039;&#039;&#039;#qt-pyside&#039;&#039;&#039;&lt;br /&gt;
* [http://lists.qt-project.org/mailman/listinfo/pyside Lista de emails oficial]&lt;br /&gt;
* Keybase: [https://keybase.io/team/pyside keybase.io/team/pyside]&lt;br /&gt;
* Gitter: [http://gitter.im/PySide/pyside2 gitter.im/PySide/pyside2]&lt;br /&gt;
&lt;br /&gt;
== Status do desenvolvimento ==&lt;br /&gt;
&lt;br /&gt;
=== Progresso de desenvolvimento semanal === &lt;br /&gt;
O resumo do progresso do desenvolvimento pode ser encontrado em [https://wiki.qt.io/PySide2_Development_Notes Notas de desenvolvimento por data]&lt;br /&gt;
&lt;br /&gt;
=== Notas de progresso do Desenvolvimento do Pyside ===&lt;br /&gt;
&lt;br /&gt;
A visão mais atual do progresso pode ser encontrada em Jira:&lt;br /&gt;
&lt;br /&gt;
# [https://bugreports.qt.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=17825 Problemas não resolvidos]&lt;br /&gt;
# [https://bugreports.qt.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=18025 Todos problemas (incluindo os resolvidos)]&lt;br /&gt;
&lt;br /&gt;
O segundo link é útil para monitorar o progresso. A melhor maneira de conseguir isso é ordenar a lista pela coluna &amp;quot;Updated&amp;quot;.&lt;br /&gt;
Maiores itens de lista de pendências/recursos são arquivados como &amp;quot;User Stories&amp;quot; no Jira.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted&amp;diff=33836</id>
		<title>Qt for Python/GettingStarted</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python/GettingStarted&amp;diff=33836"/>
		<updated>2018-05-27T15:13:02Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]                                                                                                                                &lt;br /&gt;
== Getting Started ==                                                                                                                                                   &lt;br /&gt;
You can install PySide2 by building the source package yourself.                     &lt;br /&gt;
                                                                                     &lt;br /&gt;
After cloning the official repository you must follow the instructions for          &lt;br /&gt;
your specific system.                                                                                                                                                    &lt;br /&gt;
=== Platform Requirements ===                                                                                                                                           &lt;br /&gt;
* &#039;&#039;&#039;Python&#039;&#039;&#039;:                                                                         &lt;br /&gt;
** Python 3 (version &amp;gt;= 3.5 recommended) and Python 2 (version &amp;gt;= 2.7 recommended).&lt;br /&gt;
* &#039;&#039;&#039;Qt&#039;&#039;&#039;:                                                                              &lt;br /&gt;
** 5.6 onward are supported, but 5.9 (recommended).&lt;br /&gt;
* &#039;&#039;&#039;libclang&#039;&#039;&#039;:                                                                           &lt;br /&gt;
** The libclang library (C-bindings), version 3.9 or higher is required for building using the PySide 5.9 branch.&lt;br /&gt;
** Prebuilt versions of it can be downloaded from [http://download.qt.io/development_releases/prebuilt/libclang/ download.qt.io].&lt;br /&gt;
* &#039;&#039;&#039;CMake (version &amp;gt;= 3.1 required) &#039;&#039;&#039;:                                                                           &lt;br /&gt;
** The build system required by for building PySide2.&lt;br /&gt;
=== Wheels === &lt;br /&gt;
&lt;br /&gt;
Pre-release wheels are available at http://download.qt.io/snapshots/ci/pyside/&lt;br /&gt;
You can install Qt for Python via pip, for example to install the latest 5.9 wheel:&lt;br /&gt;
&lt;br /&gt;
 pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.9/latest/ pyside2 --trusted-host download.qt.io&lt;br /&gt;
&lt;br /&gt;
=== Building PySide2 ===                                                                                        &lt;br /&gt;
The building processes are covered in the platform pages.                                                                                                                &lt;br /&gt;
* [[Qt_for_Python_GettingStarted/Windows|Windows]]&lt;br /&gt;
* [[Qt_for_Python_GettingStarted/X11|Linux/X11]]                                                       &lt;br /&gt;
* [[Qt_for_Python_GettingStarted/MacOS|macOS]]                                                                                    &lt;br /&gt;
==== setup.py build script ====                                                                                                                                          &lt;br /&gt;
The script &#039;&#039;setup.py&#039;&#039; in the [http://code.qt.io/cgit/pyside/pyside-setup.git/ top level repository] is used to build and install the PySide2 package. It takes a mode argument (&#039;&#039;build&#039;&#039; or &#039;&#039;install&#039;&#039;) and several options (more options are documented in setup.py itself).·                                                                                    &lt;br /&gt;
The main options are:                                                                &lt;br /&gt;
* &#039;&#039;--qmake=/path/to/qmake&#039;&#039;: Path to &#039;&#039;qmake&#039;&#039; of the Qt library to be used                    &lt;br /&gt;
* &#039;&#039;--cmake=/path/to/cmake&#039;&#039;: Path to &#039;&#039;cmake&#039;&#039; binary                                                &lt;br /&gt;
* &#039;&#039;--build-tests&#039;&#039;: Builds tests along with some helper packages&lt;br /&gt;
* &#039;&#039;--ignore-git&#039;&#039;: Prevents &#039;&#039;setup.py&#039;&#039; from cloning and checking out the git submodules.&lt;br /&gt;
* &#039;&#039;--debug&#039;&#039;: Build in Debug mode (some restrictions apply to Windows, see [[Qt_for_Python_GettingStarted/Windows#Build_considerations|Build considerations]])&lt;br /&gt;
* &#039;&#039;--reuse-build&#039;&#039;: Rebuilds only modified files&lt;br /&gt;
* &#039;&#039;--openssl=C:\Dev\qtdev\OpenSSL-Win64\bin&#039;&#039;: Path to OpenSSL&#039;s bindir which contains dlls (Only required for Windows PySide2 packages)&lt;br /&gt;
* &#039;&#039;--jobs=#&#039;&#039;: Number of # processes to use when building&lt;br /&gt;
* &#039;&#039;--standalone&#039;&#039;: Copies over the Qt libraries (and other library dependencies) into the PySide2 package to make it work on other machines (on Windows all builds are standalone, even without specifying the command line argument).&lt;br /&gt;
* &amp;quot;--verbose&amp;quot;: Prints all compiler invocations when building the package.&lt;br /&gt;
A typical invocation looks like:                                                     &lt;br /&gt;
 python setup.py install --build-tests --jobs=4                                                                                                                       &lt;br /&gt;
A successful build can be tested by running an example:                              &lt;br /&gt;
  python sources/examples/widgets/widgets/tetrix.py                                                                                                  &lt;br /&gt;
You can search for working examples by typing                                        &lt;br /&gt;
  cd sources/examples                                                        &lt;br /&gt;
  git grep &amp;quot;PySide2 port&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Running Tests ===                                                                &lt;br /&gt;
To perform all the available tests, just execute:                                                                                     &lt;br /&gt;
 python testrunner.py test  &amp;gt; testlog.txt&lt;br /&gt;
&lt;br /&gt;
Note that to successfully run the tests on Windows you need to point the PATH environment variable to the Qt libdir:&lt;br /&gt;
 set PATH=E:\Qt\5.9\msvc2015_64\bin;%PATH%&lt;br /&gt;
&lt;br /&gt;
Run only one test(qpainter_test):                                                                                                                                      &lt;br /&gt;
 ctest -R qpainter_test --verbose&lt;br /&gt;
&lt;br /&gt;
=== Building the Documentation ===                                                   &lt;br /&gt;
                                                                                     &lt;br /&gt;
This is currently unexplored terrain [https://bugreports.qt.io/browse/PYSIDE-363 PYSIDE-363], and works at least somewhat only on Linux.&lt;br /&gt;
* The sources are in pyside2/doc                                                     &lt;br /&gt;
* libXML2 and libXSLT should be present when building PySide2 (Ubuntu: apt-get install libxml2-dev libxslt1-dev)&lt;br /&gt;
* graphviz + dot should be installed                                                 &lt;br /&gt;
* QT_SRC_DIR needs to be set                                                         &lt;br /&gt;
* sphinx should be installed (pip install sphinx)                                    &lt;br /&gt;
* qdoc3 is used to generate it&lt;br /&gt;
&lt;br /&gt;
=== Using Qt Creator as a project explorer ===                                       &lt;br /&gt;
Qt Creator 4.0+ can be used to open the PySide and Shiboken CMakeLists.txt files as projects, and thus provide usual IDE features for developing PySide - project file navigation, code completion (C++ only), following symbols under cursor (C++ only), syntax highlighting, locator usage, debugging, etc.&lt;br /&gt;
                                                                                     &lt;br /&gt;
Currently there is a limitation that Shiboken has to be built first using the terminal, because the installed shiboken CMake packages will have to be specified for the PySide project in Qt Creator.&lt;br /&gt;
                                                                                     &lt;br /&gt;
The steps for opening the projects in Qt Creator are:                                &lt;br /&gt;
# Open pyside-setup/sources/shiboken2/CMakeLists.txt, and specify a 5.6 Qt Kit to be used&lt;br /&gt;
# Build the project as usual (by pressing the build icon for instance)               &lt;br /&gt;
# Open pyside-setup/sources/pyside2/CMakeLists.txt, and specify the same 5.6 Qt Kit  &lt;br /&gt;
# Go to projects tab, and under the Build / CMake section find the Shiboken2_DIR setting. You have to specify the path to the folder where the Shiboken CMake package was installed when you compiled Shiboken from the terminal·&lt;br /&gt;
# An example path under MacOS is /Users/user/Dev/pyside2-setup/pyside_install/py2.7-qt5.6.1-64bit-debug/lib/cmake/Shiboken2-2.0.0. The path has to be adjusted depending on the user folder name, the version of python and qt, etc&lt;br /&gt;
# (Optional) On MacOS you also have to set the ALTERNATIVE_QT_INCLUDE_DIR setting to the Qt kit include path (e.g. /Users/user/Dev/qt56_source/include)                                                                                                                                                                                                                                                                                                                                    &lt;br /&gt;
# Apply the CMake configuration changes (by pressing the button), and you should be able to build PySide&lt;br /&gt;
                                                                                     &lt;br /&gt;
Now you can use the project explorer to look through the source cpp files, python files, use the locator feature to open files and file classes / methods, and other features that Qt Creator provides.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting / Known Issues ==&lt;br /&gt;
                                                                                     &lt;br /&gt;
* Qt 5.9 does not work with OpenSSL 1.1                                         &lt;br /&gt;
** When doing a custom Qt build (some unspecified versions for now), It is necessary to have an OpenSSL version of 1.0.x, since there are compatibility issues with newer versions of OpenSSL ([https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes#Qt see details])&lt;br /&gt;
* PySide2 looks at the system installation if the local Qt version does not have a required module&lt;br /&gt;
**The only workaround is to uninstall any module from the system, then PySide2 can look at only the Qt path currently being use.&lt;br /&gt;
* Qt packages that directly link to OpenSSL (as opposed to runtime discovery) are not currently supported.&lt;br /&gt;
* Make sure that the Python environment location where the PySide2 package will be installed is writable (otherwise you might get various permission denied errors). The install location can be found with 99% probability by running:&lt;br /&gt;
 python -c &amp;quot;from distutils.sysconfig import get_python_lib; print(get_python_lib())&amp;quot;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python_Development_Notes&amp;diff=33835</id>
		<title>Qt for Python Development Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python_Development_Notes&amp;diff=33835"/>
		<updated>2018-05-27T15:12:44Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]   &lt;br /&gt;
== 2018 == &lt;br /&gt;
&lt;br /&gt;
==== 24. May 2018 ====&lt;br /&gt;
&lt;br /&gt;
 - discuss details of pypi uploads (accounts, processes and limits)&lt;br /&gt;
   - need package size extension from pypi&lt;br /&gt;
   - naming issues for packages&lt;br /&gt;
   - download.qt.io will be backup distribution source&lt;br /&gt;
   - need to verify pypi working &lt;br /&gt;
 - package finalization and testing (limits on changes?)&lt;br /&gt;
   - entering code freeze mode very soon (limited commitment for time being) &lt;br /&gt;
   - pep changes &lt;br /&gt;
      -&amp;gt; 1 test failure, 1 build failure&lt;br /&gt;
      -&amp;gt; attribution and doc improvements still to be done&lt;br /&gt;
   - ByteArray changes (interdependence with PEP)&lt;br /&gt;
   - potential doc changes&lt;br /&gt;
    -&amp;gt; tab browser example to be finished&lt;br /&gt;
    -&amp;gt; latest logo files need to be pushed &lt;br /&gt;
   - final release testing&lt;br /&gt;
   - TP blog post&lt;br /&gt;
 &lt;br /&gt;
==== 17. May 2018 ====&lt;br /&gt;
 - updated icons/images for Qt for Python project&lt;br /&gt;
 - PEP updates&lt;br /&gt;
  - completed the feature implementation but some bug fixing still open&lt;br /&gt;
  - discussed how heap type change and PEP changes could be easily reviewed/merged (huge patch set series)&lt;br /&gt;
 - coin&lt;br /&gt;
  - 5.11 &amp;amp; 5.6 broken, 5.9 &amp;amp; dev working&lt;br /&gt;
  - waiting for larger coin update which will enable QtForPython to be more independent from Qt CI configurations&lt;br /&gt;
  - Win32 (VS2015 only) pip received some changes but not quite available yet (subject to coin update)&lt;br /&gt;
  - Temporary Win32 wheels tests looked promising&lt;br /&gt;
 - missing bindings for QtCore/Network/Multimedia/GUI/widgets added (https://wiki.qt.io/Qt_for_Python_Missing_Bindings needs updating)&lt;br /&gt;
 - bindings for QtScxml in the works&lt;br /&gt;
 - known issue when dealing with unicode data/strings (seg faults)&lt;br /&gt;
 - various documentation fixes&lt;br /&gt;
 - dynamic System clang builds with Linux supported&lt;br /&gt;
 - small build fixes&lt;br /&gt;
 - Decreased wheel sizes&lt;br /&gt;
 - more work on blog posts and examples.&lt;br /&gt;
&lt;br /&gt;
==== 10. May 2018 ====&lt;br /&gt;
 - skipped due to public holidays&lt;br /&gt;
&lt;br /&gt;
==== 03. May 2018 ====&lt;br /&gt;
 - coin&lt;br /&gt;
  - 5.6 still blocked, 5.9/5.11/dev working&lt;br /&gt;
  - Win32 pip still on backlog&lt;br /&gt;
 - documentation&lt;br /&gt;
  - references to Shiboken being worked on&lt;br /&gt;
  - dot images finally working on https://doc-snapshots.qt.io/qtforpython/index.html&lt;br /&gt;
  - various fixes to non-class related docs&lt;br /&gt;
 - PEP updates&lt;br /&gt;
  - integration attempts have revealed some issues with shiboken, private ctors/dtors&lt;br /&gt;
  - one patchset series for PEP support and Heap Type changes pending&lt;br /&gt;
 - license updates &lt;br /&gt;
 - working on Python 2 &amp;amp; 3 type differences (avoiding developers having to deal with these differences)&lt;br /&gt;
 - Tab Browser example merged&lt;br /&gt;
&lt;br /&gt;
==== 26. April 2018 ====&lt;br /&gt;
 - New icons for project in work&lt;br /&gt;
 - 5.9 branch working  (5.11 branch is broken due to issues on the Qt side)&lt;br /&gt;
 - snapshot tool for Windows broken (crashing) -&amp;gt; fix pending but blocked by CI&lt;br /&gt;
 - in the mean time only mac and Linux snapshots working at the moment&lt;br /&gt;
 - 5.6 branch broken as well as 5.9 changes for qt5.git need to be merged to 5.6 too&lt;br /&gt;
 - delivery of 32bit Windows binaries not started&lt;br /&gt;
 - tiny bug fixes and other types of cleanups (e.g. build scripts) left and right&lt;br /&gt;
 - General replacement of Pyside name against Qt for Python (module name remains as Pyside)&lt;br /&gt;
 - APIExtractor documentation still being merged to git&lt;br /&gt;
 - style sheet issues being addressed&lt;br /&gt;
 - QtWebEngineCore bindings finally merged&lt;br /&gt;
 - PEP work ongoing (and coin to work)&lt;br /&gt;
&lt;br /&gt;
==== 19. April 2018 ====&lt;br /&gt;
 - COIN finally back in working shape&lt;br /&gt;
 - Further fixes for documentation, module pages, experimentally tried to show in Qt Assistant&lt;br /&gt;
 - Tab Browser example further improved&lt;br /&gt;
 - Qt for Python blog posts being worked on&lt;br /&gt;
 - Continued working on WebEngine issues&lt;br /&gt;
 - Some investigation and preparations to make WebEngine apps work with PyInstaller (very early phase, still doesn&#039;t work)&lt;br /&gt;
 - Pending patch for QtWebEngineCore bindings&lt;br /&gt;
 - Installation adjustments for standalone builds on Windows&lt;br /&gt;
 - Heap types are complete. Starting integration with PEP 384.&lt;br /&gt;
 - Finished the integration between ApiExtractor and Shiboken documentation.&lt;br /&gt;
 - Worked on a couple of blog posts.&lt;br /&gt;
 - Wiki structure and started to write the Tutorials&lt;br /&gt;
&lt;br /&gt;
==== 12. April 2018 ====&lt;br /&gt;
 - Getting Started guide under works by doc engineer&lt;br /&gt;
 - focus on fixing coin on Mac &amp;amp; RedHat 7.4 (looks promising so far)&lt;br /&gt;
 - shiboken documentation and diagrams being updated&lt;br /&gt;
   - old and unused docs dir shall be cleaned out&lt;br /&gt;
 - Tab Browser example improved&lt;br /&gt;
 - License page generated based on attribution files&lt;br /&gt;
 - lots of discussion when to release Qt for Python TP&lt;br /&gt;
   - after Qt 5.11 release (scheduled for 31.5.) &lt;br /&gt;
   - likely to be mid June (stay tuned)&lt;br /&gt;
 - WebEngine issues&lt;br /&gt;
   - needs updated qt.conf files to be deployed for apps&lt;br /&gt;
 - Heap types (work in progress)&lt;br /&gt;
 - still more work in pipeline to get code PEP 384 ready (Heap types are prerequisite)&lt;br /&gt;
 - Qt for Python blog posts being worked on&lt;br /&gt;
&lt;br /&gt;
==== 5. April 2018 ====&lt;br /&gt;
 - first doc snapshot is up and running: https://doc-snapshots.qt.io/qtforpython/&lt;br /&gt;
 - more work to be done to automate generation of snapshots&lt;br /&gt;
 - briefly talked about technical blog post opportunities&lt;br /&gt;
 - pdb files from Windows wheels removed (reducing the wheel size)&lt;br /&gt;
 - improving the tab browser example&lt;br /&gt;
 - coin currently not accepting changes&lt;br /&gt;
   - currently lots of pending patches start to create backlog&lt;br /&gt;
 - Heap type taking longer than expected&lt;br /&gt;
 - qApp macro reference leaks finally resolved&lt;br /&gt;
 - quite a few formatting changes to enforce a common coding style&lt;br /&gt;
 - lots of smaller fixes&lt;br /&gt;
&lt;br /&gt;
==== 29. March 2018 ====&lt;br /&gt;
 - skipped due to Easter holidays&lt;br /&gt;
&lt;br /&gt;
==== 22. March 2018 ====&lt;br /&gt;
 - Release process (do we follow Qt?) &lt;br /&gt;
   - Release manager provides packages&lt;br /&gt;
   - RTA testing to be setup -&amp;gt; for each package we run RTA&lt;br /&gt;
   - Request to be put on mailing list&lt;br /&gt;
   - Current Test setup proposal&lt;br /&gt;
     - Win10 (Python 3.6)&lt;br /&gt;
     - Linux (Python 3.6/2.7)&lt;br /&gt;
     - Mac (Python 3.6/2.7)&lt;br /&gt;
   - To be defined a test set (//TODO)&lt;br /&gt;
   - Testing information to be collected in wiki&lt;br /&gt;
 - Documentation&lt;br /&gt;
   - QML advanced tutorial documentation updated&lt;br /&gt;
   - Landing page in the works&lt;br /&gt;
   - snapshot still delayed by other qdoc bugs&lt;br /&gt;
   - style sheet update considered&lt;br /&gt;
   - so far only dealt with class docs, started to include unrelated doc pages&lt;br /&gt;
 - snapshot testing (angle &amp;amp; webengine not properly packaged on Windows)&lt;br /&gt;
 - enum support improved (dealing with scoped enums and enum values)&lt;br /&gt;
 - general bugfixing to increase stability and address mem leaks&lt;br /&gt;
 - Talks to PyData submitted&lt;br /&gt;
 - Qt Charts examples ported&lt;br /&gt;
 - Proper support for QFlags being worked on&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595] fixed&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595] first heap type protoype under review proving that concept works&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560] depends on PYSIDE-595&lt;br /&gt;
 - CI side&lt;br /&gt;
   - coin did Python updates which temporarily broke Linux wheels&lt;br /&gt;
   - briefly discussed manylinux request on mailing list (Qt forms bottom line, no point to extend beyond scope of Qt)&lt;br /&gt;
   - final list of wheels for release (win, linux, mac) x 2 (2.7 &amp;amp; 3.x Python)&lt;br /&gt;
&lt;br /&gt;
==== 15. March 2018 ====&lt;br /&gt;
 - Fix to create 3.6 Linux wheels under review.&lt;br /&gt;
 - Fix scriptableapplication build on Windows, and other small bugs.&lt;br /&gt;
 - Two QtCharts examples were ported and abstracts were written to submit PyData talks&lt;br /&gt;
 - Updating the QML advanced tutorial and adding index.rst and gettingstarted.rst&lt;br /&gt;
 - Tried the wheel pkgs for python 27 on Linux. Works OK except the webengine example, which gives random crashes.&lt;br /&gt;
 - Docs: [https://bugreports.qt.io/browse/PYSIDE-620 PYSIDE-620 Shadow build issue] fixed, fixed usage of deprecated Sphinx API, &lt;br /&gt;
 - Continued on [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560], currently  Windows problem with Linkage&lt;br /&gt;
 - Debugging on [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595], final stages&lt;br /&gt;
 - Fixed [https://bugreports.qt.io/browse/PYSIDE-258 PYSIDE-258]&lt;br /&gt;
&lt;br /&gt;
==== 08. March 2018 ====&lt;br /&gt;
 - msvcrt.dll to be shipped on Windows&lt;br /&gt;
 - wheel snapshots are automatically generated&lt;br /&gt;
   - start with public availability under http://download.qt.io/snapshots/ci/&lt;br /&gt;
   - snapshots to public pypi server under discussions&lt;br /&gt;
 - discussion on how to increase value of official pyside mailing list http://lists.qt-project.org/mailman/listinfo/pyside&lt;br /&gt;
 - looking at build issues on Windows (improving error handling)&lt;br /&gt;
 - Participation in Python User Group meeting in Berlin (https://www.meetup.com/Python-Users-Berlin-PUB/events/xhqwhpyxfblb/)&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595] - Heap Type conversions ongoing&lt;br /&gt;
   - test bed created for easier development&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-363 Documentation]&lt;br /&gt;
   -&amp;gt; Managed to make libxml, libxsl an optional dependency falling back to QtXmlPatterns (despite [https://bugreports.qt.io/browse/QTBUG-66925 QTBUG-66925])&lt;br /&gt;
   -&amp;gt; Small fixes to doc modifications&lt;br /&gt;
   -&amp;gt; Fix class inheritance diagrams for nested classes&lt;br /&gt;
&lt;br /&gt;
==== 01. March 2018 ====&lt;br /&gt;
 - automatic snapshot process almost in place (pending reviews) (RTA to follow)&lt;br /&gt;
 - general bug fixing (including build and version problems)&lt;br /&gt;
 - most community Pyside1 pages point to official Pyside 2 (Qt for Python) wiki pages&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595] - Heap Type conversions ongoing&lt;br /&gt;
 - documentation improving&lt;br /&gt;
   -&amp;gt; class diagrams being generated&lt;br /&gt;
   -&amp;gt; missing links and references&lt;br /&gt;
   -&amp;gt; dependencies to qdoc bugs&lt;br /&gt;
   -&amp;gt; snapshot process in works&lt;br /&gt;
 - added support for scoped enums in pyside&lt;br /&gt;
 - Important things discussed:&lt;br /&gt;
   - PySide2 versioning (current proposal WIP patch at https://codereview.qt-project.org/#/c/221767/)&lt;br /&gt;
     - Do official releases follow Qt branch names? - &lt;br /&gt;
       -&amp;gt; yes (minor release of Pyside is bound to same minor release of Qt&lt;br /&gt;
       -&amp;gt; patch level version may differ&lt;br /&gt;
     - Will we have snapshots, and if so, will they be uploaded to pip? How will we handle snapshot versions?&lt;br /&gt;
       -&amp;gt; tentative yes, if public pip server supports snapshots Pyside should be good citizen&lt;br /&gt;
     - alpha / beta / RC versioning?&lt;br /&gt;
       -&amp;gt; Pyside should follow the Qt schema&lt;br /&gt;
     - Probably need to take into account PEPs for versions pushed to Pypi.&lt;br /&gt;
     - Shiboken / PySide2 versions in sync?&lt;br /&gt;
       -&amp;gt; yes, they should be in sync&lt;br /&gt;
     - Will we specify a version for 5.6 branch?&lt;br /&gt;
       -&amp;gt; yes, but no packages being made&lt;br /&gt;
     - Are we sticking to the package name PySide2, but follow Qt 5.x versions as PySide2 versions?&lt;br /&gt;
       -&amp;gt; Pyside2_5.11.0 as in https://codereview.qt-project.org/#/c/221767/&lt;br /&gt;
   - Do we want to deploy msvcrt dlls into Windows packages?&lt;br /&gt;
     -&amp;gt; needs more research - is it really needed ?&lt;br /&gt;
   - Do we want to ship debug symbols for Qt inside the PySide2 packages? &lt;br /&gt;
     -&amp;gt; not for now&lt;br /&gt;
   - Do we want to ship debug Qt shared libraries for macOS packages? (not possible on Windows, not applicable on Linux afaik).&lt;br /&gt;
     -&amp;gt; not for now&lt;br /&gt;
   - How will the pip upload process look like? Manual uploads? Who takes care of it?&lt;br /&gt;
     -&amp;gt; Qt release team will take care of it&lt;br /&gt;
   - Current branching policies:&lt;br /&gt;
     -&amp;gt; 5.6 branch stops being merged into 5.9 (after pending patches have merged) -&amp;gt; cherry-pick mode&lt;br /&gt;
     -&amp;gt; 5.9 is base line for patches and being forward merged to 5.11&lt;br /&gt;
     -&amp;gt; no packages from 5.9 &amp;amp; 5.6 (interested parties need to get it from git)&lt;br /&gt;
     -&amp;gt; 5.11 becomes branch for first TP&lt;br /&gt;
     -&amp;gt; dev is feature development&lt;br /&gt;
     -&amp;gt; all first TP release related patches go to 5.9 (and 5.11 subsequently)&lt;br /&gt;
&lt;br /&gt;
==== 22. February 2018 ====&lt;br /&gt;
 - dev branch is still/again broken in CI, seems like pyside issues&lt;br /&gt;
 - changes to create automatic snapshots out of CI is still under review&lt;br /&gt;
 - Numerous small fixes to the [https://bugreports.qt.io/browse/PYSIDE-363 doc] generation, significantly bringing down the number of documentation warnings&lt;br /&gt;
 - Massaged build rules to improve built packages&lt;br /&gt;
   - Removed unnecessary _utils.py file [https://bugreports.qt.io/browse/PYSIDE-600 PYSIDE-600]&lt;br /&gt;
   - Changed wheel package names to contain both PySide2 version and Qt version against which it was built [https://bugreports.qt.io/browse/PYSIDE-613 PYSIDE-613]&lt;br /&gt;
   - Finally got libclang to be deployed into packages&lt;br /&gt;
   - Improved build process not to copy unnecessary symlinks and duplicating libraries when creating wheel (so that you don&#039;t get 3x size increase because of 3x number of WebEngine libraries) [https://bugreports.qt.io/browse/PYSIDE-495 PYSIDE-495]&lt;br /&gt;
   - Fixed wheel package names to contain correct minimum deployment target with which macOS was built with (on further analysis, this will need further improvement) [https://bugreports.qt.io/browse/PYSIDE-612 PYSIDE-612]&lt;br /&gt;
   - Fixed rpath handling for QtWebEngineProcess when creating standalone packages on macOS [https://bugreports.qt.io/browse/PYSIDE-605 PYSIDE-605]&lt;br /&gt;
 - Added CMake build rules for scriptable application example [https://bugreports.qt.io/browse/PYSIDE-597 PYSIDE-597]&lt;br /&gt;
 - Investigated and fixed a heap corruption bug in a test that caused constant crashes on macOS CI runs&lt;br /&gt;
 - Reduced number of warnings when running shiboken to create user bindings (like scriptable application example) [https://bugreports.qt.io/browse/PYSIDE-587 PYSIDE-587]&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595]: Making slow progress, still debugging. It&#039;s a difficult process, but assumption is that it will work.&lt;br /&gt;
 - Havent&#039;s merge [https://codereview.qt-project.org/#/c/220083/ this new patch] because we should be 200% sure it&#039;s properly working.&lt;br /&gt;
 - Working on a few bugs [https://bugreports.qt.io/browse/PYSIDE-106 PYSIDE-106] [https://bugreports.qt.io/browse/PYSIDE-570 PYSIDE-570]&lt;br /&gt;
 - One of the bugs [https://bugreports.qt.io/browse/PYSIDE-611 PYSIDE-611] was valid only for 5.6, but I noticed a strange behaviour on 5.9, so I will keep working on it, even after we move 5.6 to cherry pick mode.&lt;br /&gt;
&lt;br /&gt;
==== 15. February 2018 ====&lt;br /&gt;
 - CI broken, 5.6 &amp;amp; dev branch broken, 5.9 just got working again&lt;br /&gt;
 - first TP will be 5.11 based (needs 5.11 git branches, 5.6 branch goes into cherry-pick mode, 5.9 branch remains main target)&lt;br /&gt;
 - more modules added to doc, qt3d &amp;amp; qtquick has some special handling&lt;br /&gt;
 - snippet work ongoing&lt;br /&gt;
 - snapshot generation on the agenda&lt;br /&gt;
 - lots of bug fixing e.g.: [https://bugreports.qt.io/browse/PYSIDE-104 PYSIDE-104]&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560]&lt;br /&gt;
&lt;br /&gt;
==== 8. February 2018 ====&lt;br /&gt;
 - Looking through previous EuroPython talks to write a proposal for this year.          &lt;br /&gt;
 - Working on a few bugs (fixed a couple related to objects references),                 &lt;br /&gt;
   - that sadly will open new issues with memory management. A further analysis on this matter could improve the current memory leaks on PySide.                           &lt;br /&gt;
 - Trying to &amp;quot;organise&amp;quot; a little the typesystem XML files.                               &lt;br /&gt;
 - Working on [https://bugreports.qt.io/browse/PYSIDE-104 PYSIDE-104] that ended up being a general issue on PySide about a proper verification between slots and signals arguments, to find the best match.&lt;br /&gt;
 - Merged a few build related changes in 5.6&lt;br /&gt;
   - Pending change for [https://bugreports.qt.io/browse/PYSIDE-593 PYSIDE-593]&lt;br /&gt;
   - Pending change for [https://bugreports.qt.io/browse/PYSIDE-605 PYSIDE-605]&lt;br /&gt;
   - Merged changes for [https://bugreports.qt.io/browse/PYSIDE-603 PYSIDE-603] and [https://bugreports.qt.io/browse/PYSIDE-604 PYSIDE-604]&lt;br /&gt;
 - Investigated and attached minimal reproducible example for [https://bugreports.qt.io/browse/PYSIDE-585 PYSIDE-585]&lt;br /&gt;
 - Investigated some macOS build related aspects for package release&lt;br /&gt;
 - 5.6 CI is unblocked, but 5.9 CI is blocked due to qtbase issues (version bumping)&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560] waiting for view&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595] work ongoing, not ready yet&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-363 PYSIDE-363]  Documentation: Fixed images, fix handling of qdocconf files  that contain several modules. Looking at snippet resolution.&lt;br /&gt;
 - Problems with Qt3D due to refactoring of Qt3Dextras in 5.10. Pushed  [https://codereview.qt-project.org/#/c/219105/ patch] suggestion.&lt;br /&gt;
&lt;br /&gt;
==== 1. February 2018 ====&lt;br /&gt;
 - Continued work on documentation [https://bugreports.qt.io/browse/PYSIDE-363 PYSIDE-363], fixed static pages, add more modules, fixed parameters to qdoc, images&lt;br /&gt;
 - The GettingStarted wiki is getting better, besides a cleaning it a bit&lt;br /&gt;
   - moved the topics around to have guidelines by supported platform (&#039;&#039;a la Qt&#039;&#039;)&lt;br /&gt;
   - have received feedback and trying to add more information&lt;br /&gt;
 - Addressed bugs:&lt;br /&gt;
   - [https://bugreports.qt.io/browse/PYSIDE-34 PYSIDE-34]&lt;br /&gt;
   - [https://bugreports.qt.io/browse/PYSIDE-264 PYSIDE-264]&lt;br /&gt;
   - cleaning a bit Shiboken&#039;s XML files.&lt;br /&gt;
   - [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560]&lt;br /&gt;
     - ported to 5.9, extended to 18 header files&lt;br /&gt;
     - solved unicode problem&lt;br /&gt;
     - reduced the patches to be minimal (avoid many #ifdef&#039;s, use a verbose macro name if possible)&lt;br /&gt;
     - made everything compile but one announced file: &amp;quot;object.h&amp;quot; depends on the heaptypes solution ([https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595]). Removed WIP status,review pending.&lt;br /&gt;
   - [https://bugreports.qt.io/browse/PYSIDE-595 PYSIDE-595]&lt;br /&gt;
     - Started experimenting&lt;br /&gt;
     - turned out that the signature extension barfed because it could no longer find the type &amp;quot;__name__&amp;quot;. The function PyType_Type.tp_new needs to be called to provide the &amp;quot;ht_name&amp;quot; attribute that is used in heaptypes.&lt;br /&gt;
 - solving the attribution file issues.&lt;br /&gt;
 - Pending patches to fix libICU issues&lt;br /&gt;
 - Pending patches to fix OpenSSL issues [https://bugreports.qt.io/browse/PYSIDE-599 PYSIDE-599]&lt;br /&gt;
 - Pending patches to deploy libclang library for shiboken&lt;br /&gt;
 - Improved documentation about OpenSSL dependency&lt;br /&gt;
 - Pending patches for cleaning up build scripts a bit (logging and refactoring)&lt;br /&gt;
 - Pending patches to reduce barrage of warnings [https://bugreports.qt.io/browse/PYSIDE-587 PYSIDE-587]&lt;br /&gt;
 - Pending patch for adding CMake build rules for the scriptable_application example (useful as a reference on how to use shiboken for custom bindings) [https://bugreports.qt.io/browse/PYSIDE-597 PYSIDE-597]&lt;br /&gt;
 - Old 5.6 CI integration issue fix, but a new issue appeared that was fixed for 5.9 and dev, but still blocks 5.6&lt;br /&gt;
 - Updated the qml basics tutorial&lt;br /&gt;
&lt;br /&gt;
==== 25. January 2018 ====&lt;br /&gt;
 - Pyside not renamed&lt;br /&gt;
 - Releasing preparation&lt;br /&gt;
   - pip packages created by coin&lt;br /&gt;
   - Automated release testing (RTA) (installing pip, launching an example)&lt;br /&gt;
   - final selection of release package targets to be define closer to release (depending on current stable ABI work)&lt;br /&gt;
 - Investigation doc issues when using prefix &amp;amp; shadow builds&lt;br /&gt;
 - Need to identify prime demos/examples&lt;br /&gt;
 - Started to rework [[PySide2 GettingStarted|Getting Started Guide]] wiki &lt;br /&gt;
 - Addressed cmake build issues&lt;br /&gt;
 - Handling libICU issues (causing linker issues when importing QtCore)&lt;br /&gt;
 - Continued work on [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560]&lt;br /&gt;
&lt;br /&gt;
==== 18. January 2018 ====&lt;br /&gt;
  - macOS framework fix (should ignore qt4 system headers)&lt;br /&gt;
  - another patch on top to fix OpenGL integer types on mac / Linux (GLuint64, GLint64)&lt;br /&gt;
  - Fixed so that PySide 5.6/5.9 is not linked against the Python shared / static library (this was wrong because the symbols need to be picked up by the dynamic loader from the python interpreter itself). http://bugreports.qt.io/browse/PYSIDE-522 &lt;br /&gt;
  - Completed move of examples from pyside-examples.git to pyside-setup&lt;br /&gt;
  - added additional OpenGL2 core example&lt;br /&gt;
  - fixed testrunner (these silently failed since forever) https://codereview.qt-project.org/#/c/216732/&lt;br /&gt;
  - fixed issues whereby wrong QObject ctors were selected&lt;br /&gt;
  - removed webkit from Pyside2 build  &lt;br /&gt;
  - talk about Windows specific instructions for [[PySide2 GettingStarted|Getting Started Guide]] &lt;br /&gt;
  - Qt3D issues in Qt 5.10 fixes&lt;br /&gt;
  - clazy warning fixes&lt;br /&gt;
  - Stable ABI work (started to convert implementations) (see [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560])&lt;br /&gt;
    - requires adoption of HeapTypes&lt;br /&gt;
  - QML tutorial updates&lt;br /&gt;
  - Doc snapshots being prepared&lt;br /&gt;
&lt;br /&gt;
==== 11. January 2018 ====&lt;br /&gt;
 - multi pyside packages (not easy to do)&lt;br /&gt;
   - unlikely to achieve until TP&lt;br /&gt;
   - a package per python release (3.4, 3.5, 3.6, 2.7) &lt;br /&gt;
   - package per platform (win 32bit|64bit, mac, linux)&lt;br /&gt;
   - long term task to convert to reduced Python API (to support multi 3x packages)&lt;br /&gt;
   =&amp;gt; have to cut some targets: one 3x and 2.7 release&lt;br /&gt;
   -&amp;gt; create doc howto to encourage custom builds for not covered platform combo &lt;br /&gt;
   -&amp;gt; do we need commercial for release&lt;br /&gt;
 - pysinstaller is an installer &lt;br /&gt;
   -&amp;gt; deployqt tool not necessary&lt;br /&gt;
   -&amp;gt; documentation required stating the option&lt;br /&gt;
 - rename import options&lt;br /&gt;
   - rename via alias possible &lt;br /&gt;
   -&amp;gt; still an issue when looking up particular types but probably manageable   &lt;br /&gt;
   - renaming option: Qt4Pyton, QtPy, QtPython, Python4Qt, Qt&lt;br /&gt;
 - example shift&lt;br /&gt;
   - https://codereview.qt-project.org/#/c/215900/&lt;br /&gt;
 - Basics for doc generation toolchain&lt;br /&gt;
 - Issues where cmake picks up platform Qt references where it should use a Qt custom install&lt;br /&gt;
 - Qt3D bindings still under progress&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-34 PYSIDE-34] &amp;amp; [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560] &lt;br /&gt;
 - Documentation&lt;br /&gt;
   - minor doc fixes&lt;br /&gt;
   - documenting examples&lt;br /&gt;
&lt;br /&gt;
==== 4. January 2018 ====&lt;br /&gt;
 - multi pyside packages (not easy to do)&lt;br /&gt;
 - renaming Pyside to &amp;quot;Qt for Python&amp;quot;&lt;br /&gt;
   - quite challenging due to implied import and lib changes&lt;br /&gt;
   - alias for existing imports would be beneficial&lt;br /&gt;
 - discussion around existing function test&lt;br /&gt;
   -&amp;gt; working assumption is that we ignore added function and check for existing base line only&lt;br /&gt;
   -&amp;gt; effort too large to maintain every single new addition&lt;br /&gt;
 - discussed issues around concurrent existing Qt builds while building pyside (potential cross leakage)&lt;br /&gt;
 - various fixes to doc generation steps (see [https://bugreports.qt.io/browse/PYSIDE-363 PYSIDE-363])&lt;br /&gt;
 - discussed need for good examples as part of documentation&lt;br /&gt;
   -&amp;gt; considered options to cleanup and remove need for submodule&lt;br /&gt;
&lt;br /&gt;
== 2017 == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 21. December 2017 ====&lt;br /&gt;
 - Issues building for Windows for Python 2 and 3 (on coin)&lt;br /&gt;
 - discussing potential pyside demo/example for RTA purposes&lt;br /&gt;
 - Continued work on macOS / Qt 4 header issues, progress is there&lt;br /&gt;
   - breaks GL signature test on Linux, needs further investigation&lt;br /&gt;
 - Investigated PyInstaller (potential option to deploy apps written with Pyside)&lt;br /&gt;
   - seems to work almost out-of-the-box for deploying PySide apps&lt;br /&gt;
 - Investigated building one package compatible with multiple Python 3.x minor versions&lt;br /&gt;
   - not possible currently, will require a lot of work, possibly not feasible&lt;br /&gt;
   =&amp;gt; we need to build 3.4,3.5,3.6 * win, linux, mac packages = 9 packages&lt;br /&gt;
   =&amp;gt; 3 more for each platform and Python 2.x&lt;br /&gt;
   =&amp;gt; commercial packages?&lt;br /&gt;
 - lots of discussions and fixing of doc tool chain (qdoc in dev currently broken)&lt;br /&gt;
   - adding documentation has begun in earnest&lt;br /&gt;
 - continued work on PYSIDE-578&lt;br /&gt;
&lt;br /&gt;
==== 7. December 2017 ====&lt;br /&gt;
 - pip wheel installation &lt;br /&gt;
   - adding support for simultaneously python 2 and 3 builds&lt;br /&gt;
   - open issues: test installation towards multi python 3 versions&lt;br /&gt;
   - delivery channel for Pyside binaries (pip server? local install from qt account download?)&lt;br /&gt;
 - investigate options to have sth like pyinstallqt (pysinstaller is a possibility)&lt;br /&gt;
 - final keyword support by shiboken&lt;br /&gt;
 - Qt3D bindings patch close to completion - &amp;gt; requires some Qt changes in 5.9.4 or later Qt&lt;br /&gt;
 - fixing pyside build issues when encountering Qt 4 headers on macOS&lt;br /&gt;
 - PYSIDE-578 (testing procedure/testrunner) -&amp;gt; adds heuristic to adapt to failure rates (flakiness handling)&lt;br /&gt;
   - concerns that running all tests 5 times adds too much load on the CI (test runs needed)&lt;br /&gt;
&lt;br /&gt;
==== 30. November 2017 ====&lt;br /&gt;
 - packaging related coin changes&lt;br /&gt;
 - last weeks merges between 5.6 and 5.9+ blocking coin have been fixed (in particular on RHEL)&lt;br /&gt;
   - 5.9 + 5.6 are passing, dev has some private Qt changes which will affect pyside/dev&lt;br /&gt;
 - lots of coin infrastructure issues &lt;br /&gt;
 - RTA test wheels added (install and launch single example)&lt;br /&gt;
 - crash bugs in 5.6 branch reported but not details known yet (waiting for more details)&lt;br /&gt;
 - some discussion what changes should be put to 5.6 vs 5.9 branch&lt;br /&gt;
 - Qt3D bindings started&lt;br /&gt;
   - some changes in qt3d/5.9 required)&lt;br /&gt;
   - shiboken bugs discovered in the process (virtual function guessing &amp;amp; some comparison operators for namespace generated)&lt;br /&gt;
 - small regression related to rpath handling on Linux&lt;br /&gt;
 - open pip wheel issues:&lt;br /&gt;
   - handling of multi Python version wheels&lt;br /&gt;
 - testrunner bugs addressed and reducing flakiness&lt;br /&gt;
 - issues in Pyside when building with gcc 7.x&lt;br /&gt;
 - qdoc from qt5/dev is required for pyside due to webxml support&lt;br /&gt;
   - it is a problem for the pyside/5.9 branch&lt;br /&gt;
&lt;br /&gt;
==== 23. November 2017 ====&lt;br /&gt;
 - pip wheel support issues on Linux solved (not yet verified)&lt;br /&gt;
   -&amp;gt; libICU usage on Linux should be enabled via pyside setup script&lt;br /&gt;
   -&amp;gt; downloaded from qt account download area&lt;br /&gt;
   - discussion how to do wheel builds for different Qt base lines -&amp;gt; implies to different wheel packages&lt;br /&gt;
   - need to evaluate how different python versions on various Linux distros impact wheel binaries&lt;br /&gt;
   - target: 6 wheels (2 per platform for 2.7 &amp;amp; 3.5+ Python)&lt;br /&gt;
   - OpenGL example&lt;br /&gt;
   - merge 5.6-&amp;gt; 5.9 attempted&lt;br /&gt;
     - signature update to match Qt 5.9 ABI/signatures&lt;br /&gt;
     - plenty of testing flakiness and also test crashes &lt;br /&gt;
   - improvements to signature tests&lt;br /&gt;
&lt;br /&gt;
==== 16. November 2017 ====&lt;br /&gt;
 - Build system cleanup. It is now possible to build only a subset of Qt modules per cmd line option&lt;br /&gt;
   -  this is not complete and may need further patches&lt;br /&gt;
 - Added QAxContainer, more classes from 5.10&lt;br /&gt;
 - Preparing to add Qt3D&lt;br /&gt;
 - Removed flaky test&lt;br /&gt;
 - further research on how pip wheels might be used for Pyside&lt;br /&gt;
   - seems to work well on win &amp;amp; macOS&lt;br /&gt;
   - problems on Linux related to libICU (or in general due to different system libraries)&lt;br /&gt;
 - implemented and tested --standalone feature for the main Qt platforms [https://bugreports.qt.io/browse/PYSIDE-558 PYSIDE-558]&lt;br /&gt;
 - open question remains how 3rdparty Pyside deployment path might look like&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510]&lt;br /&gt;
&lt;br /&gt;
==== 9. November 2017 ====&lt;br /&gt;
 - Work on simplifying the build system, made it possible to specify a module subset to build&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-558 PYSIDE-558] Fixing rpaths and making --standalone work on the 3 platforms. Result: Self-contained binary wheels. Needs Review.&lt;br /&gt;
 - Trying to setup the project for building the docs. I managed to build the rsts from the patch in gerrit but running sphinx on those rsts results in errors about python 2 style code.&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] work continued&lt;br /&gt;
&lt;br /&gt;
==== 2. November 2017 ====&lt;br /&gt;
 - Releasing:&lt;br /&gt;
   - continued work on macOS installer &lt;br /&gt;
   - binaries must be patched during the install from repo (rpath setting)&lt;br /&gt;
   - adopting the scripts from Qt for Pyside&lt;br /&gt;
   - made pip install work on Mac -&amp;gt; would be alternative to online installer approach&lt;br /&gt;
     - two deployment choices available&lt;br /&gt;
 - discussions on how void* pointer should be handled, two options on the table&lt;br /&gt;
   - add additional Pyside module handling such pointers&lt;br /&gt;
   - add feature to shiboken to transparently add the support to any arbitrary C++/pyside project using shiboken&lt;br /&gt;
 - documentation snapshot generated&lt;br /&gt;
 - simplified setup-pyside and related build script options&lt;br /&gt;
&lt;br /&gt;
==== 26. October 2017 ====&lt;br /&gt;
 - Releasing:&lt;br /&gt;
   - test repo for online installer created (mac seems to deploy)&lt;br /&gt;
   - first evaluation of suggested installer approach on various platforms&lt;br /&gt;
 - Documentation:&lt;br /&gt;
   - Qt doc team joined the effort&lt;br /&gt;
   - first experiences are collected&lt;br /&gt;
   - should new documentation be done in rst rather than qdoc format?&lt;br /&gt;
   - Getting started, General platform requirements and general fixes turning up during generation&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-571 PYSIDE-571] received further fixes and reviews&lt;br /&gt;
 - REDHAT not working on Coin (caused by gcc header issues)&lt;br /&gt;
 - other minor improvements&lt;br /&gt;
&lt;br /&gt;
==== 19. October 2017 ====&lt;br /&gt;
 - Discuss open Pyside 2 release &amp;amp; documentation&lt;br /&gt;
 - Release packaging suggestion&lt;br /&gt;
   - Qt for Python installed via Qt installer and python scripts pointed to module via PYTHON_PATH&lt;br /&gt;
   - create test online repository for Qt installer&lt;br /&gt;
   - follow up how this Pyside installation approach might impact deployment of Python apps using Qt for Python&lt;br /&gt;
   - Linux distros shipping Pyside? (not sure yet either)&lt;br /&gt;
 - coin&lt;br /&gt;
   - breakage in CI provisioning due to competing Python binaries coming from MSVC 2017&lt;br /&gt;
   - coin template needs updating&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-571 PYSIDE-571] work progressing (ready for review)&lt;br /&gt;
 - lots of fixes in Pyside dev branch and &lt;br /&gt;
 - feedback from Qt World Summit:&lt;br /&gt;
   - is Pyside on Android and iOS?&lt;br /&gt;
   - iOS probably out since platform cannot have interpreted code&lt;br /&gt;
   - Scriptable application use case was a sought after feature&lt;br /&gt;
   - qdoc got WebXML patch -&amp;gt; open question which version to use for doc generation across the various pyside versions&lt;br /&gt;
     - add script to support single command to generate documentation&lt;br /&gt;
&lt;br /&gt;
==== 12. October 2017 ====&lt;br /&gt;
 - no update due to Qt World Summit 2017&lt;br /&gt;
&lt;br /&gt;
==== 05. October 2017 ====&lt;br /&gt;
 - Qt DataVisualization port has finished including an example&lt;br /&gt;
 - Coin no progress due to pending Qt 5.9.2 release&lt;br /&gt;
 - webxml support being implemented inside qdoc (beginning of the pyside documentation toolchain)&lt;br /&gt;
&lt;br /&gt;
==== 28. September 2017 ====&lt;br /&gt;
 - 5.6 and 5.9 branches are *finally* enforced by CI - yeeeaaahh&lt;br /&gt;
 - Dev branch is still missing some forward merges before it can be enabled.&lt;br /&gt;
 - port of QtDataVisualization progressing&lt;br /&gt;
 - fixed bugs: [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510], [https://bugreports.qt.io/browse/PYSIDE-517 PYSIDE-517], [https://bugreports.qt.io/browse/PYSIDE-562 PYSIDE-562], [https://bugreports.qt.io/browse/PYSIDE-564 PYSIDE-564]&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-156 PYSIDE-156] in progress, first example of qApp protection, benchmark of impact ongoing&lt;br /&gt;
&lt;br /&gt;
==== 21. September 2017 ====&lt;br /&gt;
&lt;br /&gt;
 - Prototyping and exploring of Pyside packaging options&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] done and merged&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-156 PYSIDE-156] being addressed thanks to [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510]&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-487 PYSIDE-487] Qt Data Visualization port progressing&lt;br /&gt;
&lt;br /&gt;
==== 14. September 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
   - 5.6 testing is back online (5.9 target unblocking pending a merge)&lt;br /&gt;
   - Packaging of Pyside started to become a discussion topic&lt;br /&gt;
     - Standard PIP deployment&lt;br /&gt;
     - Separate delivery via the usual Qt account channel&lt;br /&gt;
 - void* support has a pending patch (https://codereview.qt-project.org/#/c/205124/ and related example https://codereview.qt-project.org/#/c/205272/)&lt;br /&gt;
 - Documentation work ongoing&lt;br /&gt;
   - WebXML support was added to qdoc - see [https://bugreports.qt.io/browse/PYSIDE-363 PYSIDE-363]&lt;br /&gt;
   - inputting the resulting WebXML to shiboken gave promising results&lt;br /&gt;
   - Qt Creator gain ability to fold away Python license headers &lt;br /&gt;
 - Signature patch (https://codereview.qt-project.org/#/c/198654/)&lt;br /&gt;
&lt;br /&gt;
==== 7. September 2017 ====&lt;br /&gt;
 - Pyside CI broken (timeout for tests is zero)&lt;br /&gt;
   - Pyside provisioning scripts are very fragile&lt;br /&gt;
   - Qt&#039;s own  provisioning is interfering when e.g. Pyside relevant tools get changed by Qt&lt;br /&gt;
   - new ideas and redesign is likely to be needed &lt;br /&gt;
 - New Bindings: QRegularExpression, QVersionNumber, QUuid, &lt;br /&gt;
 - Discussions around Documentation for pyside&lt;br /&gt;
   - couple of options for generation pipeline&lt;br /&gt;
     1.) qdoc generates WebXML -&amp;gt; Shiboken converts WebXML to ReST (used to work in Qt 4 days)&lt;br /&gt;
     2.) qdoc is lib which creates AST - &amp;gt; shiboken uses the AST to generate ReST&lt;br /&gt;
     3.) \pyside to document python classes (lots of documentation effort and not ReST integratable)&lt;br /&gt;
     4.) minimalistic approach is to merely link to the Qt object class reference (python specific docs are somewhat separate&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-516 PYSIDE-516] further investigation how to deal with void* APIs&lt;br /&gt;
   -&amp;gt; prototyping ongoing&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] redesigned once again (no more internal Python dependencies, Python version independent implementation)&lt;br /&gt;
   &lt;br /&gt;
==== 31. August 2017 ====&lt;br /&gt;
 - 5.9 passes on all platforms but one (10.10 still failing)&lt;br /&gt;
   -&amp;gt; fix for provisioning scripts pending&lt;br /&gt;
 - 5.6 no problems at hand (all passing)&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-516 PYSIDE-516] hit a dead end&lt;br /&gt;
   -&amp;gt; fundamental way of passing vertex data (void*) pointer between Python and C++ not addressed yet&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] complete&lt;br /&gt;
&lt;br /&gt;
==== 24. August 2017 ====&lt;br /&gt;
 - Coin 5.9 provisioning is in place, but there are some issues with paths to tools which are being addressed&lt;br /&gt;
 - Build issue on Windows 10 5.9 branch, addressed by patch in review https://codereview.qt-project.org/#/c/203406/&lt;br /&gt;
 - Fix to macOS build when old Qt 4.8 is present, addressed by patch https://codereview.qt-project.org/#/c/203313/&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-516 PYSIDE-516] progress on bringing in more of the QOpenGL classes&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-560 PYSIDE-560] stable ABI was investigated, decision is required&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] finalizing license modifications&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-156 PYSIDE-156] ongoing implementation for fixing qApp crashes&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-552 PYSIDE-552] in process of being merged&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-562 PYSIDE-562] pending patch&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-563 PYSIDE-563] in process of being merged&lt;br /&gt;
 - PySide 2 presentation being prepared for Qt World Summit 2017&lt;br /&gt;
&lt;br /&gt;
==== 17. August 2017 ====&lt;br /&gt;
 - Almost everyone is still on holiday - not much progress&lt;br /&gt;
 - PySide 5.9 branch CI changes are still pending integration / ongoing due to issues with the CI infrastructure switch&lt;br /&gt;
 - Investigation ongoing regarding QSSL classes on 5.9 branch&lt;br /&gt;
 - PYSIDE-510 - ongoing work to make separation of different licensed code&lt;br /&gt;
 - PYSIDE-156 - initial work to stop crashes when using methods that require an allocated QApplication instance&lt;br /&gt;
 - PYSIDE-558 - initial investigation on how to proceed&lt;br /&gt;
 - Updated the PySide2 wiki documentation to clear up build steps and requirements.&lt;br /&gt;
&lt;br /&gt;
==== 10. August 2017 ====&lt;br /&gt;
 - holiday time is hampering project at the moment -  not much progress&lt;br /&gt;
 - CI changesin Qt affected Pyside project such that focus was on different CI matters&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-557 PYSIDE-557] being addressed&lt;br /&gt;
 - some very minor issues were fixed&lt;br /&gt;
&lt;br /&gt;
==== 03. August 2017 ====&lt;br /&gt;
 - PYSIDE-510 under code review https://codereview.qt-project.org/198654&lt;br /&gt;
   -&amp;gt; license issues have to be addressed&lt;br /&gt;
   -&amp;gt; some testing aspects still open (delayed till later on)&lt;br /&gt;
   -&amp;gt; investigation of impact on deployment across multiple python run-time versions required&lt;br /&gt;
 - missing bindings script/wiki page updated: [[PySide2_Missing_Bindings|Missing PySide2 bindings]]&lt;br /&gt;
 - first working array support has been delivered (some adjustments still required), now proceeding to extend for OpenGL [https://bugreports.qt.io/browse/PYSIDE-516 PYSIDE-516]&lt;br /&gt;
 - Missing classes in works (e.g. QAbstractnativeEventFilter, QFileLock,....)&lt;br /&gt;
   -&amp;gt; revealed some issues of handling void* pointers&lt;br /&gt;
&lt;br /&gt;
==== 27. July 2017 ====&lt;br /&gt;
 - Fix for [https://bugreports.qt.io/browse/PYSIDE-331 PYSIDE-331] causes lots crashes in auto tests&lt;br /&gt;
   -&amp;gt; more investigation ongoing&lt;br /&gt;
 - coin&lt;br /&gt;
   - since 5.6 is now enforced by Qt CI the focus shifted to the 5.9 branch of Pyside&lt;br /&gt;
   - still encountering build issues on 5.6 though&lt;br /&gt;
   - cmake upgrade for macOS 10.10&lt;br /&gt;
   - missing virtual env for macOS 10.12 being deployed&lt;br /&gt;
   - msvc 2013 being removed from CI targets&lt;br /&gt;
   - clang on OpenSuSE deployment ongoing&lt;br /&gt;
   - lots of effort went into debugging the above Coin issues&lt;br /&gt;
 - numpy support for 2d array feature development progressing ([https://bugreports.qt.io/browse/PYSIDE-354 PYSIDE-354])&lt;br /&gt;
&lt;br /&gt;
==== 20. July 2017 ====&lt;br /&gt;
 - coin&lt;br /&gt;
   - license test passing&lt;br /&gt;
   - setup issues wit Python 3 and msvc 2008 vs 2015 issues&lt;br /&gt;
   =&amp;gt; need to install newer Python 3 binaries&lt;br /&gt;
   =&amp;gt; otherwise looks like enforced testing can be set alive on 5.6 branch&lt;br /&gt;
  - 5.9 still having clang header issues&lt;br /&gt;
 - 2D array support work in progress&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-331 PYSIDE-331] -&amp;gt; waiting for PYSIDE-510 dependency&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510]-&amp;gt; issues with Python 2.x left&lt;br /&gt;
 - need to get a handling what functions are not supported by pyside due to exclusions or missing support in shiboken&lt;br /&gt;
&lt;br /&gt;
==== 13. July 2017 ====&lt;br /&gt;
 - coin&lt;br /&gt;
   - Production coin was updated today and all fixes are finally executed&lt;br /&gt;
   - 5.6 &lt;br /&gt;
  	- macOS 10.11 machines have Python 2.6, which causes test script to fail due its usage of a &lt;br /&gt;
          module added in 2.7. Investigation in progress on the best way to fix this.&lt;br /&gt;
  	- build failure with Windows 8.1 (msvc2013-x86) &lt;br /&gt;
   - 5.9 &lt;br /&gt;
  	- macOS 10.12 missing virtual env (https://codereview.qt-project.org/200006)&lt;br /&gt;
  	- Rest Linux/macOS configs are failing various build issues&lt;br /&gt;
   - dev is still pending for qt5 merge from 5.9   &lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] development completed, test added, needs review&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-331 PYSIDE-331] ongoing work&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-550 PYSIDE-550] investigated, needs a working solution to allow proper building on distros that separate Qt private headers into separate packages&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-354 PYSIDE-354] ongoing work on C / C++ array support in PySide, some questions remains on how to deal with xml syntax and multiple dimensions.&lt;br /&gt;
&lt;br /&gt;
==== 29. June 2017 ====&lt;br /&gt;
 - coin&lt;br /&gt;
   - Qt 5.6 all coin changes for Pyside are done but waiting for coin production update (after Qt 5.9.1 release)&lt;br /&gt;
   - Pyside/Qt 5.6 on new OpenNebula infrastructure confirmed to run&lt;br /&gt;
   - Qt 5.9 based setup still misses clang libs (merge pending)&lt;br /&gt;
   - Pyside/Qt 5.9 test failure fixes on macOS&lt;br /&gt;
 - worked on array support (passing arrays between Pyside and Qt API) - work in progress ([https://bugreports.qt.io/browse/PYSIDE-354 PYSIDE-354])&lt;br /&gt;
 - continued work on debug builds across the platforms&lt;br /&gt;
 - embedded Python example under review (further testing across the platforms)&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-510 PYSIDE-510] finished (not yet merged) -&amp;gt; revealed a few more  problems in [https://bugreports.qt.io/browse/PYSIDE-331 PYSIDE-331] &amp;amp; [https://bugreports.qt.io/browse/PYSIDE-308 PYSIDE-308]&lt;br /&gt;
 - added a way to dynamically detect the available Qt modules in Pyside&lt;br /&gt;
&lt;br /&gt;
==== 22. June 2017 ====&lt;br /&gt;
 - building pyside on Win with debug and non-debug&lt;br /&gt;
 - QSSL* classes do not build on macOS &amp;amp; Windows (patch in progress)&lt;br /&gt;
 - dll name handling work finished (build system issues were addressed)&lt;br /&gt;
 - PYSIDE-531 discussions &lt;br /&gt;
 - coin&lt;br /&gt;
   - followup from 18 May (windows issues in coin)&lt;br /&gt;
   - test runner changes being merged should address this &lt;br /&gt;
   - new regression on macOS targets though&lt;br /&gt;
   - 5.9 issues due to clang continue to exist (will be addressed after 5.6 is enforced)&lt;br /&gt;
&lt;br /&gt;
==== 15. June 2017 ====&lt;br /&gt;
 - dll name handling fixed across the platforms (e.g. pkgconfig handling)&lt;br /&gt;
 - PYSIDE-500 fixed&lt;br /&gt;
 - PYSIDE-331 is still not done (in parts a module by module fix is required)&lt;br /&gt;
 - PYSIDE-510 ongoing&lt;br /&gt;
 - no further progress on coin&lt;br /&gt;
 - Getting started guide has been updated dealing with Qt 5.6 and Qt 5.9 based Pyside builds&lt;br /&gt;
 - scriptable Pyside example been developed to demonstrate SDK-like usage of Pyside&lt;br /&gt;
 - lots of small infrastructure changes/fixes&lt;br /&gt;
&lt;br /&gt;
==== 8. June 2017 ====&lt;br /&gt;
 - Proposed solution for PYSIDE-500&lt;br /&gt;
 - Further work on example for PYSIDE-526, work on shiboken2 command line handling to ease usage with qmake&lt;br /&gt;
 - Updated Getting started Wiki&lt;br /&gt;
 - Introspection work continued (PYSIDE-510)&lt;br /&gt;
&lt;br /&gt;
==== 1. June 2017 ====&lt;br /&gt;
 - PYSIDE-500&lt;br /&gt;
 - https://wiki.qt.io/PySide2_GettingStarted needs a serious cleanup&lt;br /&gt;
   - 5.6 vs 5.9 differences not explained&lt;br /&gt;
   - specify exact version matching conditions&lt;br /&gt;
 - pyside repo merge completed&lt;br /&gt;
  - Coin changes required to catchup - &amp;gt; recent CI issues have caused delay&lt;br /&gt;
 - Introspection work continued (PYSIDE-510) -&amp;gt; not yet complete&lt;br /&gt;
 - qtcharts and related examples have been ported (5.9 only)&lt;br /&gt;
 - license header checks of Pyside for Coin able to distinguish branches&lt;br /&gt;
 - Array support for Pyside missing (numpy_array support?)&lt;br /&gt;
&lt;br /&gt;
==== 18. May 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
  - Win nodes didn&#039;t run the cleanup functions -&amp;gt; test failures due to artifacts -&amp;gt; no solution yet&lt;br /&gt;
  - Clang issues persist and this must be addressed in the broader scope of Qt/qdoc depending on libclang too&lt;br /&gt;
    -&amp;gt; until this point in time the setup is a manual one for pyside/5.9+&lt;br /&gt;
 - merge of psyide repositories -&amp;gt; no objections against the plan in the community&lt;br /&gt;
   -&amp;gt; merge will happen in the next few days (pyside.git, pyside-setup.git and shiboken.git become one repo)&lt;br /&gt;
   -&amp;gt; examples, wiki and tools will remain as they are&lt;br /&gt;
 - QOpenGL* porting continuing&lt;br /&gt;
 - qttext2speech ported to Pyside2&lt;br /&gt;
 - failing QML tests in Qt 5.9 based Pyside &lt;br /&gt;
 - PYSIDE-510 - introspection solution in the works&lt;br /&gt;
 - Qt World Summit Berlin 2017 (talk for Pyside being handed in)&lt;br /&gt;
&lt;br /&gt;
==== 12. May 2017 ====&lt;br /&gt;
 - looked into the Windows tests failures, and the reason might be related to how we copy around build artifacts, leading to an incorrect folder structure. Coin team to look at it.&lt;br /&gt;
 - Fixed a small regression in 5.9 with building on macOS after some cmake changes that happened in 5.6&lt;br /&gt;
 - Implemented, tested, reviewed and committed the multimedia widgets examples&lt;br /&gt;
 - documentation from Pyside1 days can not be generated anymore&lt;br /&gt;
   -&amp;gt; new approach required using exiting Qt5 doc tools&lt;br /&gt;
 - QOpenGL* port to Pyside has started -&amp;gt; missing support for arrays in shiboken&lt;br /&gt;
   - more thorough design discussion needed&lt;br /&gt;
 - Coin&lt;br /&gt;
   - provisioning for clang in Qt CI ongoing: https://codereview.qt-project.org/#/c/192517/10&lt;br /&gt;
&lt;br /&gt;
==== 04. May 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
  - libclang 4.0 provisioning available (code reviews ongoing -&amp;gt; enabler for Pyside and qdoc testing)&lt;br /&gt;
  - 5.6 coin issues resolved&lt;br /&gt;
  - macOS related CI/cmake failures were resolved&lt;br /&gt;
  - some CI sync issues among pyside submodules (always submodules HEAD is tested)&lt;br /&gt;
  =&amp;gt; may have to change once we come closer to the final release -&amp;gt;&lt;br /&gt;
  =&amp;gt; fine as long as we are in heavy development mode&lt;br /&gt;
  - discussion around Ubuntu and OpenSuse configurations&lt;br /&gt;
  - minimal cmake requirements not met on all distros&lt;br /&gt;
    - 5.6 only be build using RedHat 6.6&lt;br /&gt;
    - 5.9 builds have updated Linux distros -&amp;gt; may be able to obtain a new cmake version without hacking the standard toolchain&lt;br /&gt;
 - QtMultimedia and QRaster* API bindings further completed&lt;br /&gt;
 - added tests and examples for the above bindings/APIs&lt;br /&gt;
 - PYSIDE-510 (required for simplified and more generic testing of bindings)&lt;br /&gt;
 - PYSIDE-504 work is ongoing&lt;br /&gt;
 - PYSIDE-507 -&amp;gt; avoid hardcoded includes when certain Qt modules are not available&lt;br /&gt;
 - brief discussion whether to merge the shiboken and pyside repo&lt;br /&gt;
   -&amp;gt; advantages from a CI perspective and reduces pyside setup complexity&lt;br /&gt;
&lt;br /&gt;
==== 26. April 2017 ====&lt;br /&gt;
 - Coin &lt;br /&gt;
   - provision for 5.9+ branches -&amp;gt; we would like to use libclang 4.0&lt;br /&gt;
   - test still not yet executed due to branch mismatch which pulls in dev branches&lt;br /&gt;
 - missing bindings in QtCore/QtGui/QtMultimedia - work in progress&lt;br /&gt;
 - clang support done (except for a Mac issue)&lt;br /&gt;
   - Pyside clang version required Qt 5.7 or later&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-500 PYSIDE-500] done&lt;br /&gt;
 - work on PYSIDE-500, 502, 504, 497 will continue&lt;br /&gt;
 - qdoc work started trying to recover whatever documentation is left from Pyside 1.x&lt;br /&gt;
&lt;br /&gt;
==== 20. April 2017 ====&lt;br /&gt;
 - Fix for [https://bugreports.qt.io/browse/PYSIDE-331 PYSIDE-331] broke the Windows build; under investigation&lt;br /&gt;
 - Refactoring, fixed build warnings&lt;br /&gt;
 - Looked at debug builds on Windows&lt;br /&gt;
&lt;br /&gt;
==== 13. April 2017 ====&lt;br /&gt;
 - discussion around merge policies between 5.9 and 5.6 branch&lt;br /&gt;
 - Linux debug library issues fixed&lt;br /&gt;
 - PYSIDE-488 fixed via workaround&lt;br /&gt;
 - fixed a unit tests&lt;br /&gt;
 - worked on qdoc/html generation in Pyside (failed so far - waiting for qdoc maintainer feedback)&lt;br /&gt;
 - PYSIDE-331 patches merged -&amp;gt; more bugs found in the meantime&lt;br /&gt;
&lt;br /&gt;
==== 6. April 2017 ====&lt;br /&gt;
 - 5.6 branch created&lt;br /&gt;
 - 5.9 branch to be created as well (easier setup for Qt 5.9 testing in Coin)&lt;br /&gt;
 - Coin&lt;br /&gt;
   - not passing build platforms have been disabled&lt;br /&gt;
   - otherwise COIN passing on 5.6 (except for 2 failing test) -&amp;gt; soon to be enforced&lt;br /&gt;
   - license checker passing in dev&lt;br /&gt;
 - clang changes merged to dev branch (after reviews)&lt;br /&gt;
   - clang provisioning on Coin still missing&lt;br /&gt;
 - for now shiboken is not a generic C++ bindings generator (targeting Qt use cases only)&lt;br /&gt;
 - TODO: enabling the generation of documentation from repos&lt;br /&gt;
 - fixed mixed usage of debug and release build (no debug builds for windows)&lt;br /&gt;
 - [PYSIDE-331] work continuing - fixed, tests are missing&lt;br /&gt;
&lt;br /&gt;
==== 30. March 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
   - some platforms passing and will be enabled by default&lt;br /&gt;
   - MinGW, some OSX and cross compile targets remain out&lt;br /&gt;
 - will branch pyside dev branches to 5.6, new dev becomes clang branch&lt;br /&gt;
   - regular merges from 5.6 -&amp;gt; dev will start happening&lt;br /&gt;
   - Pyside 5.6 branch will continue to work against Qt 5.6&lt;br /&gt;
 - need reviews for [https://bugreports.qt.io/browse/PYSIDE-323 PYSIDE-323] to merge clang changes&lt;br /&gt;
   - Qt 5.10, 5.9 (on main desktop plawtforms working)&lt;br /&gt;
   - for now the Pyside dev development will be based on Qt 5.9 (to be bumped up later on)&lt;br /&gt;
 - [PYSIDE-331] - in progress&lt;br /&gt;
 - [PYSIDE-156] - &lt;br /&gt;
&lt;br /&gt;
==== 23. March 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
   - progressing&lt;br /&gt;
 - More tests fixed&lt;br /&gt;
 - wip/clang branch created, will receive Clang parser port with instructions&lt;br /&gt;
 - Refactoring of shiboken, replaced QtXml classes by QXmlStreamReader allowing for stricter error checking&lt;br /&gt;
&lt;br /&gt;
==== 16. March 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
   - the fixes are still integrating or are under review (no further progress until this is done)&lt;br /&gt;
 - clang parser replacement [https://bugreports.qt.io/browse/PYSIDE-323 PYSIDE-323]&lt;br /&gt;
   - most test failures related to clang are fixed&lt;br /&gt;
   - tests ran pretty much through on Qt 5.9 (Windows and Linux - Mac not yet verified)&lt;br /&gt;
   - code cleanups in shiboken&lt;br /&gt;
   - will create feature branch on all pyside repos to get the clang patch series under CI control&lt;br /&gt;
   - merges from regular pyside branches into clang branch will commence&lt;br /&gt;
   - readme required that explains how clang is to be built (if not provided by platform)&lt;br /&gt;
 - [PYSIDE-331] - in progress&lt;br /&gt;
&lt;br /&gt;
==== 09. March 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
   - lots of changes in Gerrit for Pyside and coin&lt;br /&gt;
   - the outcome has to be check once everything merged&lt;br /&gt;
   - upcoming clang dependencies in shiboken introduces new requirements for Coin&lt;br /&gt;
   - clang changes to be dealt with after pyside branching&lt;br /&gt;
 - clang&lt;br /&gt;
   - first complete bindings generation with Qt 5.6 and Qt 5.9&lt;br /&gt;
   - some failing unit tests which have to be looked at individually&lt;br /&gt;
   - actual merge depends on pyside branching which in turn depends on recent Coin changes&lt;br /&gt;
 - smart pointer support&lt;br /&gt;
   - patches generally done, gerrit review ongoing&lt;br /&gt;
   - rather large patch&lt;br /&gt;
 - created list of missing bindings in Pyside ([https://wiki.qt.io/PySide2_Missing_Bindings Missing Bindings])&lt;br /&gt;
   - mostly class level view, global functions at al not covered&lt;br /&gt;
 - Jira cleanup&lt;br /&gt;
   - PYSIDE-464, PYSIDE-217, Pyside-224 fixed&lt;br /&gt;
   - most bugs reviewed now and valid ~100 bugs were identified&lt;br /&gt;
&lt;br /&gt;
==== 02. March 2017 ====&lt;br /&gt;
 - Coin&lt;br /&gt;
   - Coin runs tests on Windows and OSX (some failures in the test - to be investigated)&lt;br /&gt;
   - Windows provisioning somewhat blocked due to CI issues&lt;br /&gt;
   - no progress on Linux&lt;br /&gt;
   - OSX 10.8 ran tests with expected results&lt;br /&gt;
   - OSX 10.9 has issues due to Pyside not supporting namespace builds of Qt&lt;br /&gt;
 - clang&lt;br /&gt;
   - preprocessor has remaining issue&lt;br /&gt;
     -&amp;gt; with clang compiler but gcc seems OK&lt;br /&gt;
     -&amp;gt; Qt Core wrapper close to compiling (QHash issues remaining)&lt;br /&gt;
 - Smart pointer work continues&lt;br /&gt;
   - some uses cases work, other use cases might remain&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-364 PYSIDE-364] was fixed (patch pending)&lt;br /&gt;
 - General error review on bugreports.qt.io&lt;br /&gt;
   - 50% done (prioritized bugs are handled/checked bugs - &amp;quot;done&amp;quot; bugs)&lt;br /&gt;
 - ran address and leak sanitizer over Pyside which resulted in some worrying cases (need to be addressed going forward)&lt;br /&gt;
&lt;br /&gt;
==== 22. February 2017 ====&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-462 PYSIDE-462] Improved solution approved&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-205 PYSIDE-205] Hard-to-detect memory leak plugged&lt;br /&gt;
   - slow memory leak found in shiboken with thousands of false positives&lt;br /&gt;
   - used differential analysis of valgrind output&lt;br /&gt;
 - Clang: Fixed Preprocessor handling (set defines, include paths), got minimal binding tests to pass, now adapting MetaBuilder and PySide to what Clang finds when parsing Qt. Good news: Very little need to set Q_DOC or other magic defines&lt;br /&gt;
 - Coin: Slow progress, currently struggling with provisioning&lt;br /&gt;
 - extensive bug triaging ongoing in Pyside Jira project&lt;br /&gt;
&lt;br /&gt;
==== 16. February 2017 ====&lt;br /&gt;
 - Coin (no update - other priorities in release/CI team)&lt;br /&gt;
 - Clang (progressing on pre-processor work)&lt;br /&gt;
 - PYSIDE-315 closed&lt;br /&gt;
 - PYSIDE-462 more review needed&lt;br /&gt;
 - Shared pointer API very slowly progressing (lots of different fixes needed)&lt;br /&gt;
 - QMimeDataBase support added&lt;br /&gt;
 - QUrlQuery support blocked on QDOC defines in Qt sources (shiboken sets the wrong define)&lt;br /&gt;
 - chasing memory leaks (PSYIDE-205)&lt;br /&gt;
 - extensive bug triaging ongoing in Pyside Jira project&lt;br /&gt;
   - confirming and testing the reported bugs (70 of 200 processed)&lt;br /&gt;
   - some smaller bugs were fixed in the process&lt;br /&gt;
 - quite a few bugs were discovered this week while working on the above items, e.g.:&lt;br /&gt;
   - deployment of pyside applications partly broken due to hard-coded install paths in Qt libs&lt;br /&gt;
   - Qt events are swallowed when Pyside error/exception occurs&lt;br /&gt;
&lt;br /&gt;
==== 9. February 2017 ====&lt;br /&gt;
 - Clang progressed&lt;br /&gt;
   - pure C++ tests for API extractions are passing (C++ parsing based on clang)&lt;br /&gt;
   - even works with cmake&lt;br /&gt;
   - old C++ preprocessor still to be replaced&lt;br /&gt;
   - working through old preprocessor and checking what magic it did and how clang might be able to replace it&lt;br /&gt;
 - PYSIDE-315 &amp;amp; PYSIDE-462 fixes pending for review&lt;br /&gt;
 - COIN&lt;br /&gt;
   - continue progress an getting more platforms to pass (unblocking one step at a time)&lt;br /&gt;
   - Windows (32bit) and mac are building, Win 64bit still not building&lt;br /&gt;
   - OSX and Windows are stopping in the test runner phase&lt;br /&gt;
   - missing cmake update still on Linux (provisioning update required)&lt;br /&gt;
&lt;br /&gt;
==== 26 January 2017 ====&lt;br /&gt;
 - PYSIDE-315&lt;br /&gt;
   - principle fix merged but some minor improvements still pending&lt;br /&gt;
 - Pyside-462&lt;br /&gt;
   - essentially a feature request as C++ default parameters are not yet supported by Pyside&lt;br /&gt;
   - discussion ongoing how to address the problem&lt;br /&gt;
 - COIN &lt;br /&gt;
   - 10.11, 10.9 &amp;amp; 10.8 build passes&lt;br /&gt;
   - 10.10 still failing during build&lt;br /&gt;
   - Progress on Windows and running into new problems further down the path&lt;br /&gt;
   - Redhat failed to general brokenness of the platform in CI&lt;br /&gt;
   - Ubuntu no further progress&lt;br /&gt;
 - clang parser work progressing&lt;br /&gt;
   - completeness of work is currently measured by passing unit tests&lt;br /&gt;
   - there is a long way to go &lt;br /&gt;
   - see [https://bugreports.qt.io/browse/PYSIDE-323 PYSIDE-323] and associated patches for progress monitoring&lt;br /&gt;
 - Fixed regression which prevented Pyside to compile with Qt 5.5.1&lt;br /&gt;
 - shared pointer support&lt;br /&gt;
 - no update on 2nd February 2017 (next week)&lt;br /&gt;
&lt;br /&gt;
==== 19 January 2017 ====&lt;br /&gt;
 - PYSIDE-315&lt;br /&gt;
   - a possible fix is pending, some minor performance improvements are still possible&lt;br /&gt;
   - caused by different signal/slot ordering in Qt4 and Qt 5&lt;br /&gt;
 - COIN &lt;br /&gt;
   - issues on 10.8 and 10.9 platforms should pass now&lt;br /&gt;
   - 10.11 &amp;amp; 10.10 still have issues&lt;br /&gt;
   - Windows timeout problem fix in COIN (but no COIN update until 5.8.0 released)&lt;br /&gt;
   - Linux builds are failing&lt;br /&gt;
     - Ubuntu 14.04 fails due to cmake issue&lt;br /&gt;
     - Redhat 6.6 &amp;amp; OpenSuse 13.01 deferred&lt;br /&gt;
   - current COIN freeze for 5.8.0 release affecting patching of COIN for Pyside&lt;br /&gt;
   - next steps in priority -&amp;gt; run tests on 10.8/10.9 and get Linux running&lt;br /&gt;
 - PYSIDE-79 regression fixed as well (some interaction between PYSIDE-315 &amp;amp; PYSIDE-79)&lt;br /&gt;
 - PYSIDE-462 to be looked at next&lt;br /&gt;
 - clang parser work progressing&lt;br /&gt;
&lt;br /&gt;
==== 12 January 2017 ====&lt;br /&gt;
 - PYSIDE-315&lt;br /&gt;
   - sorting of slots/signal connection changed on Qt side and Pyside side has not caught up&lt;br /&gt;
   - had similar connection issues on the QML side, need to investigate whether there is a connection&lt;br /&gt;
 - PYSIDE-79&lt;br /&gt;
   - caused a regressions (not yet investigated)&lt;br /&gt;
 - fixed OpenGL types not being recognized on MacOS (partly fixed)&lt;br /&gt;
 - API&#039;s with shared/smart pointers in Qt don&#039;t work&lt;br /&gt;
   - has potential long term effects and investigation has started into the reasons&lt;br /&gt;
 - Refactoring shiboken in preparation for clang&lt;br /&gt;
 - COIN currently runs tests with namespaced Qt&lt;br /&gt;
   - short term fix to exclude namespaced Qt builds with Pyside (broken on MacOS 10.9)&lt;br /&gt;
   - other failures: missing libraries on MacOS (10.11), missing provisioning on Windows, cmake issues on 10.10&lt;br /&gt;
   - unknown state on Linux (current Redhat too old)&lt;br /&gt;
 - Prioritization after status round:&lt;br /&gt;
   - PYSIDE-315 to be investigated based on recent signal/slot patches for QML&lt;br /&gt;
   - Smart pointer issues reduced in priority to provide space for PYSIDE-315 &amp;amp; PYSIDE-79 regression&lt;br /&gt;
 - verify that COIN runs testrunner (not just building Pyside)&lt;br /&gt;
   -&amp;gt; not yet verified since we are still failing builds in COIN&lt;br /&gt;
&lt;br /&gt;
==== 5 January 2017 ====&lt;br /&gt;
 - COIN update&lt;br /&gt;
   - COIN changes merged (no further patches pending)&lt;br /&gt;
   - need to run an integration test&lt;br /&gt;
   - issues related to different build platforms still to be expected&lt;br /&gt;
 - Continue with clang&lt;br /&gt;
   - backtracking a bit (reusing some node API&#039;s during parsing but otherwise use clang to populate the tree)&lt;br /&gt;
 - test blacklisting reviewed (some removed - mostly signal related ones, one new regression)&lt;br /&gt;
 - regressions in QtQuick were worked around (caused by recent Qt Quick changes)&lt;br /&gt;
 - issues with macos framework style includes in Qt&lt;br /&gt;
 - PYSIDE-315 debugging ongoing, very hard to track down&lt;br /&gt;
   - was it a regression from a previous Pyside release (e.g. Qt 5.4?!?&lt;br /&gt;
 - hard-copied Qt 5.4 based headers still in existence&lt;br /&gt;
   - updated needed but would shut Qt 5.4 users out&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2016 ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 22 December 2016 ====&lt;br /&gt;
 - lots of discussions around the COIN patches&lt;br /&gt;
   - source archive setup being under review &lt;br /&gt;
   - Qt 5.6 provisioning patches merged&lt;br /&gt;
   - CI uses Python 2.7 at this stage&lt;br /&gt;
 - clang C++ parsing continues&lt;br /&gt;
 - fix of some Pyside unit tests (now have a clean slate again)&lt;br /&gt;
 - finished QtQuick port&lt;br /&gt;
 - some overflow problems have been fixed in shiboken&lt;br /&gt;
&lt;br /&gt;
==== 15 December 2016 ====&lt;br /&gt;
 - COIN changes pending for testing infrastructure&lt;br /&gt;
   -&amp;gt; https://codereview.qt-project.org/177136 (Pyside change)&lt;br /&gt;
   -&amp;gt; https://codereview.qt-project.org/176968 (Coin change)&lt;br /&gt;
   -&amp;gt; https://codereview.qt-project.org/179662 (Provisioning changes)&lt;br /&gt;
   -&amp;gt; https://codereview.qt-project.org/179663 (Provisioning changes)&lt;br /&gt;
 - waiting for COIN development team to review/accept the pending changes&lt;br /&gt;
 - no update in PYSIDE-315 (under investigation)&lt;br /&gt;
 - Flushed out a couple of shiboken, QML, qml example bugs&lt;br /&gt;
 - Some bugs related to parser delayed until clang parser task done (https://bugreports.qt.io/browse/PYSIDE-322)&lt;br /&gt;
 - most basic shiboken API extractor test to pass (global enumeration test)&lt;br /&gt;
 - some trouble with int size data types&lt;br /&gt;
   -&amp;gt; Python 2 &amp;amp; 3 are different and the relevant C++ data types are yet again different from platform to platform&lt;br /&gt;
&lt;br /&gt;
==== 8 December 2016 ====&lt;br /&gt;
 - COIN patches pending approval&lt;br /&gt;
   - Windows provisioning reviewed&lt;br /&gt;
   - Linux, Pyside, COIN itself&lt;br /&gt;
 - Clang changes progressing, comparing AST tree from old parser and clang&lt;br /&gt;
 - PYSIDE-79 done&lt;br /&gt;
 - PYSIDE-315 under investigation&lt;br /&gt;
 - QtQuick patches taking shape (some template magic and function pointer &lt;br /&gt;
   features in Qt cannot be parsed by shiboken)&lt;br /&gt;
&lt;br /&gt;
==== 1 December 2016 ====&lt;br /&gt;
 - COIN &lt;br /&gt;
 - PYSIDE-79 there seems to be a final work around (https://codereview.qt-project.org/#/c/176374/)&lt;br /&gt;
   - fixing a few tests in the process&lt;br /&gt;
 - clang update&lt;br /&gt;
   - dumping AST, identifying the required info&lt;br /&gt;
   - work in progress...&lt;br /&gt;
 - problems with global static QObjects on the Qt side calling back into Python during app exit&lt;br /&gt;
   - may require some changes on the Qt side&lt;br /&gt;
&lt;br /&gt;
==== 24 November 2016 ====&lt;br /&gt;
 - automatic COIN triggering for submodules work in progress&lt;br /&gt;
   - several discussions on this topic this week&lt;br /&gt;
 - Clang investigation (what library to use)&lt;br /&gt;
 - fixing bugs on Qt side for Pyside&lt;br /&gt;
 - Qt QML support almost done, work will continue with Qt Quick&lt;br /&gt;
 - PYSIDE-79 work story continues&lt;br /&gt;
   - reference counting not quite accurate but point of deallocation of ref count not identifiable&lt;br /&gt;
&lt;br /&gt;
==== 17 November 2016 ====&lt;br /&gt;
 - Pyside team suffering from sickness -&amp;gt; not much progress this week&lt;br /&gt;
 - Pyside-79 fix had a lot of negative side effects (breaking existing tests)&lt;br /&gt;
   - internal object reference counting is the predominant issue at hand&lt;br /&gt;
   - continue to work on the bug (no resolution yet as delayed due to sickness)&lt;br /&gt;
 - COIN some progress but still open discussions on branching policy required&lt;br /&gt;
&lt;br /&gt;
==== 11 November 2016 ====&lt;br /&gt;
 - PYSIDE-79 being fixed&lt;br /&gt;
 - PYSIDE-315 to be addressed&lt;br /&gt;
 - Shiboken and Clang&lt;br /&gt;
   - familiarizing with clang and its parser&#039;s inner working&lt;br /&gt;
   - added experimental qmake project definition for shiboken (makes work in Qt Creator easier)&lt;br /&gt;
 - Qt QML on Pyside work progressing&lt;br /&gt;
 - work on COIN did not progress due to conflicting priorities inside COIN development&lt;br /&gt;
&lt;br /&gt;
==== 3 November 2016 ====&lt;br /&gt;
 - working through the QML stack esnuring all required API&#039;s are exported (https://codereview.qt-project.org/#/c/175682/)&lt;br /&gt;
 - small build system patches&lt;br /&gt;
 - PYSIDE-79 work progressing&lt;br /&gt;
 - OpenGL support fixed (PYSIDE-314)&lt;br /&gt;
 - COIN issues&lt;br /&gt;
   - repo interdepencies not working yet, suggestion under discussion and to be implemented&lt;br /&gt;
   - most license checks have been fixed&lt;br /&gt;
   - Qt 5.6 based Pyside to skip check&lt;br /&gt;
   - after branching for C++11 work the dev branch should work from license check perspective&lt;br /&gt;
   - eventually the entire CI needs to run through (more hidden problems could be hidden)&lt;br /&gt;
 - Started working on C++11 compliant parser for shiboken&lt;br /&gt;
   - libclang will be used&lt;br /&gt;
   - first target is to replace the AST tree implementation&lt;br /&gt;
   - requires clang setup in the CI&lt;br /&gt;
&lt;br /&gt;
==== 27 October 2016 ====&lt;br /&gt;
 - Work on WebKit/WebEngine support&lt;br /&gt;
 - Further work on [https://bugreports.qt.io/browse/PYSIDE-431 COIN] support&lt;br /&gt;
 - Planning meeting&lt;br /&gt;
 - Workshop for C++11 support in Pyside ([https://bugreports.qt.io/browse/PYSIDE-323 PYSIDE-323])&lt;br /&gt;
&lt;br /&gt;
==== 20 October 2016 ====&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-355 Qt Quick support] submitted&lt;br /&gt;
 - [https://bugreports.qt.io/browse/PYSIDE-314 QtOpenGL support] submitted&lt;br /&gt;
 - Further work on [https://bugreports.qt.io/browse/PYSIDE-431 COIN] support, license headers&lt;br /&gt;
==== 13 October 2016 ====&lt;br /&gt;
 - Qt CI update&lt;br /&gt;
   - Coin changes have merged but integration not yet working&lt;br /&gt;
   - Qt CI enables on Pyside side merged &lt;br /&gt;
   =&amp;gt; COIN integration fails with license issues&lt;br /&gt;
   =&amp;gt; requires review of license conditions for all files, some files are not even relicensable&lt;br /&gt;
   =&amp;gt; skipping license check for now, most likely to be done later again but requires changes to license check script&lt;br /&gt;
   - more issues of interworking between QtCI and Pyside expected (won&#039;t be visible until license problems resolved)&lt;br /&gt;
   Open issue: does a change in Pyside repo trigger a rebuild of everything?&lt;br /&gt;
 - Qt QML support progressing and first patches merged&lt;br /&gt;
   - serious bugs have been fixed, more complex QML examples are now working&lt;br /&gt;
&lt;br /&gt;
==== 29 September 2016 ====&lt;br /&gt;
 - Coin integration close but not merged&lt;br /&gt;
 - Bugfixing in particular on the shiboken parser side&lt;br /&gt;
 - QML/Python binding and tests fixed -&amp;gt; general check all day-to-day aspects of QML are working&lt;br /&gt;
 - QML examples porting &lt;br /&gt;
   -&amp;gt; still some failing tests&lt;br /&gt;
   -&amp;gt; Check all QML/Quick class are exported&lt;br /&gt;
&lt;br /&gt;
==== 22 September 2016 ====&lt;br /&gt;
 - Refactored Shiboken, udnerstanding build sequences&lt;br /&gt;
 - black list for unit tests defined and tested&lt;br /&gt;
 - fixing of tests&lt;br /&gt;
 - QML example fixing continued (QML bindings not working)&lt;br /&gt;
 - Pyside side for COIN done (pending integration checks)&lt;br /&gt;
 - COIN integration still wip due to long test and retest cycles&lt;br /&gt;
 - pyside and shiboken repo to be relicensed similar to other Qt products&lt;br /&gt;
 =&amp;gt; this should address any issues regarding the status of generated code too&lt;br /&gt;
 &lt;br /&gt;
==== 16 September 2016 ====&lt;br /&gt;
 - Pyside side for CI testing ready for testing&lt;br /&gt;
 - status of COIN side to be determined. Code exists need help from CI team to confirm status.&lt;br /&gt;
 - build system infrastructure improvements in pyside setup&lt;br /&gt;
 - Qt logging now working&lt;br /&gt;
 - and more&lt;br /&gt;
 - Update on bug handling&lt;br /&gt;
   - PYSIDE-88 continuing&lt;br /&gt;
   - PYSIDE-349 (Multimedia ported)&lt;br /&gt;
   - PYSIDE-344 fix pending on codereview&lt;br /&gt;
   - make debug builds of Pyside work (OSX works, Linux has work in progress patch, Windows side awaiting contribution)&lt;br /&gt;
 - QML support work in progress&lt;br /&gt;
   - examples are slowly ported with aim to identify bugs&lt;br /&gt;
&lt;br /&gt;
==== 25 August 2016 ====&lt;br /&gt;
 - Properly implementing QML experience in Pyside&lt;br /&gt;
 - Unit test fixing&lt;br /&gt;
 - automated CI testing for Pyside&lt;br /&gt;
   - working locally but still failures occurring on various other test machines&lt;br /&gt;
&lt;br /&gt;
==== 4 August 2016 ====&lt;br /&gt;
 - Additional Pyside examples under review&lt;br /&gt;
 - Fixed warnings coming from Shiboken&lt;br /&gt;
&lt;br /&gt;
==== 21 July 2016 ====&lt;br /&gt;
&lt;br /&gt;
 - main Pyside 2 example port done&lt;br /&gt;
 - additional examples to fill gaps are being ported (as per prio list)&lt;br /&gt;
 - CI patches running, but still gaps (should be done by next week)&lt;br /&gt;
 - about 86% of auto test working (failing count of test 80+ auto test)&lt;br /&gt;
 - [[pyside-Teststatus|Project Test Status]]&lt;br /&gt;
&lt;br /&gt;
==== 14 July 2016 ====&lt;br /&gt;
&lt;br /&gt;
 - Pyside 2 examples ported&lt;br /&gt;
 - OpenGL &amp;amp; SVG not working&lt;br /&gt;
 - QtQuick 2 is in strange situation (QtQml depends on QtQuick)&lt;br /&gt;
 - Python 3 realed Unicode handling not working with Qt&lt;br /&gt;
 - QMessageBox hangs&lt;br /&gt;
 - no documentation for any example&lt;br /&gt;
 - lots of warnings when building wrapper&lt;br /&gt;
 - results: https://paste.kde.org/pgje2toyh/mlbqic&lt;br /&gt;
 - COIN setup for pyside https://codereview.qt-project.org/#/c/158336/&lt;br /&gt;
 - Qt 5.7 still blocked due to missing C++11 support in shiboken&lt;br /&gt;
   - food for ideas: https://steveire.wordpress.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 7 July 2016 ====&lt;br /&gt;
&lt;br /&gt;
 - automated CI testing&lt;br /&gt;
 - patches for Pyside and Qt CI side required&lt;br /&gt;
 - Testing somewhat more complicated due to closed nature of Qt CI &lt;br /&gt;
 - script to port examples to Qt 5 -&amp;gt; https://bugreports.qt.io/issues/?jql=labels%20%3D%20exampleport5&lt;br /&gt;
 - all examples to remain BSD licensed&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Backlog ===&lt;br /&gt;
&lt;br /&gt;
The list below represents some short term targets and long term ideas for Pyside2 development. There is no guarantee that this will happen as written down. It is meant as a short reminder and idea collection for future development. In the long term this list is likely to move to https://bugreports.qt.io/browse/PYSIDE.&lt;br /&gt;
&lt;br /&gt;
# First time with Pyside (Document how to get started on this wiki)&lt;br /&gt;
# Testing Infrastructure&lt;br /&gt;
## What has been done so far?&lt;br /&gt;
## Qt CI support ([https://bugreports.qt.io/browse/PYSIDE-431 PYSIDE-431])&lt;br /&gt;
### make test&lt;br /&gt;
### cmake based build system (all repos)&lt;br /&gt;
### pip installable Pyside&lt;br /&gt;
#### CI has to setup virtual Python environment&lt;br /&gt;
#### Use pip to install/build Pyside (release bundling)&lt;br /&gt;
&lt;br /&gt;
# Future changes to PySide&lt;br /&gt;
## Gaps (modules &amp;amp; API)&lt;br /&gt;
### Identify the extent of the gaps by porting existing examples from Qt4 to Qt5 (done)&lt;br /&gt;
### Plugin system (in what form or shape do we need it is uncertain - some failing tests exist already)&lt;br /&gt;
### Prepare a summary of gaps for other modules&lt;br /&gt;
## Fundamental Architecture changes&lt;br /&gt;
### Shiboken&lt;br /&gt;
#### Clang support ([https://bugreports.qt.io/browse/PYSIDE-323 PYSIDE-323])&lt;br /&gt;
### QtQML support ([https://bugreports.qt.io/browse/PYSIDE-355 PYSIDE-355])&lt;br /&gt;
## MyPy (type annotation - fully typed Python API)&lt;br /&gt;
## General Python features and their adoption in PySide (e.g. Async I/O)&lt;br /&gt;
## Creator and tooling&lt;br /&gt;
### Fix QtC debugger to understand Python/C++ mixed internals&lt;br /&gt;
## Documentation generation&lt;br /&gt;
## Deployment of apps&lt;br /&gt;
## Debugging support&lt;br /&gt;
&lt;br /&gt;
# Must have tasks for first release&lt;br /&gt;
## Packaging (e.g. pip deployment? )&lt;br /&gt;
## Clarify Installer story&lt;br /&gt;
## Documentation&lt;br /&gt;
## Product placement decisions&lt;br /&gt;
### Licensing&lt;br /&gt;
### Naming&lt;br /&gt;
### etc&lt;br /&gt;
## Complete CI coverage&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Qt_for_Python_DBusIntegration&amp;diff=33834</id>
		<title>Qt for Python DBusIntegration</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Qt_for_Python_DBusIntegration&amp;diff=33834"/>
		<updated>2018-05-27T15:11:49Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category:QtForPython -&amp;gt; Category:Qt for Python&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Qt for Python]]&lt;br /&gt;
&lt;br /&gt;
To get PySide2 and DBus working together you can use the glib mainloop integration already done in [https://pypi.org/project/dbus-python/ dbus-python].&lt;br /&gt;
&lt;br /&gt;
The examples below show how to export Qt objects to Python and emit a D-Bus signal when a Qt signal is emitted.&lt;br /&gt;
The code comments explain what you need to know about PySide2 and D-Bus.&lt;br /&gt;
&lt;br /&gt;
Also refer to the [http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html dbus-python tutorial].&lt;br /&gt;
&lt;br /&gt;
== D-Bus Client ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -&#039;&#039;&#039;- coding: utf-8 -&#039;&#039;&#039;-&lt;br /&gt;
&lt;br /&gt;
# DBUS Client using PySide2 integration&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
from traceback import print_exc&lt;br /&gt;
&lt;br /&gt;
# import python dbus module&lt;br /&gt;
import dbus&lt;br /&gt;
# import python dbus GLib mainloop support&lt;br /&gt;
import dbus.mainloop.glib&lt;br /&gt;
# import QtCore&lt;br /&gt;
from PySide2.QtCore import *&lt;br /&gt;
&lt;br /&gt;
# signal handler&lt;br /&gt;
def button_clicked():&lt;br /&gt;
    print(&amp;quot;button clicked&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# main function&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Enable glib main loop support&lt;br /&gt;
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)&lt;br /&gt;
    # Get the session bus&lt;br /&gt;
    bus = dbus.SessionBus()&lt;br /&gt;
    &lt;br /&gt;
    try:&lt;br /&gt;
        # Get the remote object&lt;br /&gt;
        remote_object = bus.get_object(&amp;quot;com.example.SampleService&amp;quot;,&lt;br /&gt;
        &amp;quot;/DBusWidget&amp;quot;)&lt;br /&gt;
        # Get the remote interface for the remote object&lt;br /&gt;
        iface = dbus.Interface(remote_object, &amp;quot;com.example.SampleWidget&amp;quot;)&lt;br /&gt;
    except dbus.DBusException:&lt;br /&gt;
        print_exc()&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
    &lt;br /&gt;
    # Start the application&lt;br /&gt;
    app = QCoreApplication([])&lt;br /&gt;
    &lt;br /&gt;
    # Call some methods of the remote interface&lt;br /&gt;
    iface.show()&lt;br /&gt;
    iface.setText(&amp;quot;Emit signal&amp;quot;)&lt;br /&gt;
    # connect the DBus signal clicked to the function button_clicked&lt;br /&gt;
    iface.connect_to_signal(&amp;quot;clicked&amp;quot;, button_clicked)&lt;br /&gt;
    iface.connect_to_signal(&amp;quot;lastWindowClosed&amp;quot;, app.quit)&lt;br /&gt;
    &lt;br /&gt;
    # enter in the main loop&lt;br /&gt;
    app.exec_()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== D-Bus Server ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#-&#039;&#039;&#039;- coding: utf-8 -&#039;&#039;&#039;-&lt;br /&gt;
&lt;br /&gt;
# DBUS Server Example of use PySide2 with dbus-python library&lt;br /&gt;
&lt;br /&gt;
import dbus&lt;br /&gt;
import dbus.service&lt;br /&gt;
import dbus.mainloop.glib&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
from PySide2.QtCore import *&lt;br /&gt;
from PySide2.QtWidgets import QPushButton, QApplication&lt;br /&gt;
&lt;br /&gt;
# The adaptor, MUST inherit dbus.service.Object&lt;br /&gt;
class DBusWidget(dbus.service.Object):&lt;br /&gt;
    def __init__(self, name, session):&lt;br /&gt;
        # export this object to dbus&lt;br /&gt;
        dbus.service.Object.__init__(self, name, session)&lt;br /&gt;
&lt;br /&gt;
        # create a simple widget&lt;br /&gt;
        self.widget = QPushButton()&lt;br /&gt;
        self.widget.resize(200, 50)&lt;br /&gt;
&lt;br /&gt;
        # To export a Qt signal as a DBus-signal, you need to connect it to&lt;br /&gt;
        # a method in this class.&lt;br /&gt;
        # The method MUST have the signal annotation, so dbus-python will&lt;br /&gt;
        # export it as a dbus-signal&lt;br /&gt;
        QObject.connect(self.widget, SIGNAL (&amp;quot;clicked()&amp;quot;), self.clicked)&lt;br /&gt;
        QObject.connect(QApplication.instance(), SIGNAL (&amp;quot;lastWindowClosed()&amp;quot;),&lt;br /&gt;
            self.lastWindowClosed)&lt;br /&gt;
&lt;br /&gt;
    # You can export methods to dbus like you do in python-dbus.&lt;br /&gt;
    @dbus.service.method(&amp;quot;com.example.SampleWidget&amp;quot;, in_signature=&#039;&#039;, out_signature=&#039;&#039;)&lt;br /&gt;
    def show(self):&lt;br /&gt;
        self.widget.show()&lt;br /&gt;
    &lt;br /&gt;
    # Another method… now with a parameter&lt;br /&gt;
    @dbus.service.method(&amp;quot;com.example.SampleWidget&amp;quot;, in_signature=&#039;s&#039;, out_signature=&#039;&#039;)&lt;br /&gt;
    def setText(self, value):&lt;br /&gt;
        self.widget.setText(value)&lt;br /&gt;
    &lt;br /&gt;
    # Another one…&lt;br /&gt;
    @dbus.service.method(&amp;quot;com.example.SampleWidget&amp;quot;, in_signature=&#039;&#039;, out_signature=&#039;&#039;)&lt;br /&gt;
    def exit(self):&lt;br /&gt;
        qApp().quit()&lt;br /&gt;
    &lt;br /&gt;
    # A signal that will be exported to dbus&lt;br /&gt;
    @dbus.service.signal(&amp;quot;com.example.SampleWidget&amp;quot;, signature=&#039;&#039;)&lt;br /&gt;
    def clicked(self):&lt;br /&gt;
        pass&lt;br /&gt;
    &lt;br /&gt;
    # Another signal that will be exported to dbus&lt;br /&gt;
    @dbus.service.signal(&amp;quot;com.example.SampleWidget&amp;quot;, signature=&#039;&#039;)&lt;br /&gt;
    def lastWindowClosed(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    print(&amp;quot;holi&amp;quot;)&lt;br /&gt;
    app = QApplication([])&lt;br /&gt;
    # Use qt/glib mainloop integration to get dbus mainloop working&lt;br /&gt;
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)&lt;br /&gt;
    &lt;br /&gt;
    session_bus = dbus.SessionBus()&lt;br /&gt;
    print(session_bus)&lt;br /&gt;
    # Export the service&lt;br /&gt;
    name = dbus.service.BusName(&amp;quot;com.example.SampleService&amp;quot;, session_bus)&lt;br /&gt;
    # Export the object&lt;br /&gt;
    widget = DBusWidget(session_bus, &#039;/DBusWidget&#039;)&lt;br /&gt;
    &lt;br /&gt;
    print(&amp;quot;Running&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the examples ===&lt;br /&gt;
&lt;br /&gt;
Copy the client code to a file called example-client.py and the server to a file called example-server.py and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
python example-server.py &amp;amp;&lt;br /&gt;
python example-client.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A small window should appear on screen. Click on the button to emit a Qt signal. The signal will be converted to a D-Bus signal that will be caught by our D-Bus client.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Waiting_for_a_Progress_Bar&amp;diff=32288</id>
		<title>Squish/Waiting for a Progress Bar</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Waiting_for_a_Progress_Bar&amp;diff=32288"/>
		<updated>2017-11-25T08:48:03Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: waiting for a progress bar or a progress dialog]] if relevant}}&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Waiting for a progress bar or progress dialog =&lt;br /&gt;
&lt;br /&gt;
When you have a calculation or some other work item in your AUT that takes an arbitrary amount of time to complete, it can be hard to get your test script to be stable by just using snooze() or waitForObject() calls to wait for the work item to finish. Instead, you can use the more powerful waitFor() method, that takes any code statement, executes it until it returns True, or until the optional timeout is reached before it continues the script playback.&lt;br /&gt;
&lt;br /&gt;
Assuming the work item shows a progress bar or a progress dialog while it is running, you can easily use waitFor() to make sure your script does not continue playback until the work item has completed and the progress dialog has gone away:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;clickButton(waitForObject(&amp;quot;:Dialog.Calculate_QPushButton&amp;quot;))&lt;br /&gt;
waitFor(&amp;quot;object.exists(&#039;:_QProgressDialog&#039;)&amp;quot;, 20000)&lt;br /&gt;
waitFor(&amp;quot;not object.exists(&#039;:_QProgressDialog&#039;)&amp;quot;)&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Verifying_the_Existence_of_a_Menu_Item&amp;diff=32287</id>
		<title>Squish/Verifying the Existence of a Menu Item</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Verifying_the_Existence_of_a_Menu_Item&amp;diff=32287"/>
		<updated>2017-11-25T08:47:50Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: verifying the existence of a menu item]] if relevant}}&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Verifying the existence of a menu item =&lt;br /&gt;
&lt;br /&gt;
To verify the existence of a menu item within a menu, there are multiple approaches: 1) accessing the QAction list supplied to us by the QWidget class through the Qt API or 2) using Squish&#039;s real name to see if the object exists.&lt;br /&gt;
&lt;br /&gt;
In the end, the usage of any of these approaches are as simple as:&lt;br /&gt;
&amp;lt;code&amp;gt;test.verify(menuItemExists(&amp;quot;File&amp;quot;, &amp;quot;&amp;amp;Save&amp;quot;))&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Qt API approach ==&lt;br /&gt;
&lt;br /&gt;
This approach uses the Qt API to access the menu and the menu&#039;s actions, and then iterate through all of the actions to see if it contains the one we are looking for.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def menuItemExists(menu, menuItem):&lt;br /&gt;
 menuName = &amp;quot;{title=&#039;s&#039; type=&#039;QMenu&#039; window=&#039;:Window&#039;}&amp;quot; menu&lt;br /&gt;
 waitFor(&amp;quot;object.exists(menuName)&amp;quot;, 20000)&lt;br /&gt;
 actions = findObject(menuName).actions()&lt;br /&gt;
 for i in range(actions.size()):&lt;br /&gt;
 action = actions.at(i)&lt;br /&gt;
 if action.text == menuItem:&lt;br /&gt;
 return True&lt;br /&gt;
 return False&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We start out by using the real name of the menu to identify it, as that gives us the ability to dynamically specify which menu Squish should be looking for. We then wait for it to exist, to make sure the script is not played back to fast, retrieve the QAction list from the menu and iterate through them, comparing the text property of QAction with the text we supply in the argument.&lt;br /&gt;
&lt;br /&gt;
== Squish&#039;s real name approach ==&lt;br /&gt;
&lt;br /&gt;
Similar to the approach above where we use the real name to get to the menu, we do the same thing but with the menu item instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def menuItemExists(menu, menuItem):&lt;br /&gt;
 menuName = &amp;quot;{title=&#039;s&#039; type=&#039;QMenu&#039; window=&#039;:Window&#039;}&amp;quot; menu&lt;br /&gt;
 menuItemName = &amp;quot;{container=%s text=&#039;s&#039; type=&#039;QAction&#039;}&amp;quot; (menuName, menuItem)&lt;br /&gt;
 return object.exists(menuItemName)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Using_Ctrl%2BA&amp;diff=32286</id>
		<title>Squish/Using Ctrl+A</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Using_Ctrl%2BA&amp;diff=32286"/>
		<updated>2017-11-25T08:46:42Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Using Ctrl+A =&lt;br /&gt;
&lt;br /&gt;
The Ctrl+A keyboard shortcut is often the most effective way to select everything in a widget to perform some operation, be it to select everything in a list view to perform an operation or to select everything in a text box to type a replacement. In general, keyboard shortcuts can be an expedient way to test functionality. Here are a couple of examples for Ctrl+A:&lt;br /&gt;
&lt;br /&gt;
== Setting a Text Box value&lt;br /&gt;
&amp;lt;code&amp;gt;#Incredibly straightforward, will work on anything with a text area that accepts standard keyboard shortcuts&lt;br /&gt;
def setTextBoxValue(boxName, value):&lt;br /&gt;
 type(waitForObject(boxName), &amp;quot;&amp;lt;Ctrl+A&amp;gt;&amp;quot;)&lt;br /&gt;
 type(waitForObject(boxName), &amp;quot;value&amp;quot;)&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
== Selecting All Items in a List&lt;br /&gt;
&amp;lt;code&amp;gt;#Works with most QAbstractItemView types e.g. QListView&lt;br /&gt;
def selectAll(viewName):&lt;br /&gt;
 #select the first item&lt;br /&gt;
 model = waitForObject(viewName).view.model()&lt;br /&gt;
 clickItem(viewName, model.data(model.index(0,0))) ==&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/nativeType_Function&amp;diff=32285</id>
		<title>Squish/nativeType Function</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/nativeType_Function&amp;diff=32285"/>
		<updated>2017-11-25T08:46:22Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
It can be the case that you need to type some text and be picked up by the application but which the receiver of the text is either unknown or very hard to predict. Think along the lines of an event filter being installed or if an object redirects events to its children.&lt;br /&gt;
&lt;br /&gt;
It&#039;s in these situations that you should always recur to the function nativeType().&lt;br /&gt;
&lt;br /&gt;
It works very similarly to type() however it doesn&#039;t take an object as its target, rather, it emulates the typing a user would do to the application. This allows it to be redirected through the same paths and be picked by the proper objects.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Keeping_an_Object_Tree_Tidy&amp;diff=32284</id>
		<title>Squish/Keeping an Object Tree Tidy</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Keeping_an_Object_Tree_Tidy&amp;diff=32284"/>
		<updated>2017-11-25T08:46:04Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
= Keep a tidy object tree =&lt;br /&gt;
Always remember to keep your tree clean by removing old objects from it or adapting the object properties to match the new layout of the application. This will accomplish 2 things:&lt;br /&gt;
1)You keep a comprehensive relationship of the objects that do exist in your application rather than a tree with every object the application has ever seen.&lt;br /&gt;
2)You will fix your application much easily.&lt;br /&gt;
&lt;br /&gt;
It can be the case that a particular object is particularly hard to predict, perhaps your application title changes with every revision of your application. If so, every build could, potentially, break your Q&amp;amp;A. Instead of trying to manually correct it or compute at run time, you should use the squish built in different modes to match properties. Remember that there exists a wildcard mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{title?=&#039;SomeApp*&#039; type=&#039;QMainWindow&#039;}&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and a regular expression mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;{title~=&#039;SomeApp.*&#039; type=&#039;QMainWindow&#039;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This way you can avoid creating too many objects and keep your tree clean.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Interacting_with_Menus&amp;diff=32283</id>
		<title>Squish/Interacting with Menus</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Interacting_with_Menus&amp;diff=32283"/>
		<updated>2017-11-25T08:45:50Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Interacting with menus and menu items =&lt;br /&gt;
&lt;br /&gt;
In [[:Category:Tools::Squish::Verifying_the_existence_of_a_menu_item | Verifying the existence of a menu item]], we saw how to access single menu items using Squish&#039;s real name approach. We can use this approach again, to implement support for dynamically interacting with menus and menu items. That is, we implement one single function for interacting with all menu items in the main window of the AUT, including menu items in sub-menus.&lt;br /&gt;
&lt;br /&gt;
[[Image:http://www.kdab.com/~tobias/interacting-with-menus.png|Menu structure]]&lt;br /&gt;
&lt;br /&gt;
Consider the menu structure above - if we simply record interaction with File -&amp;gt; New…, Edit-&amp;gt; Find -&amp;gt; Find…&lt;br /&gt;
and Edit-&amp;gt; Find -&amp;gt; Advanced-&amp;gt; Find &amp;amp; Replace…, we end up with code such as:&lt;br /&gt;
&amp;lt;code&amp;gt; # File -&amp;gt; New…&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:MainWindow.menuBar_QMenuBar&amp;quot;, &amp;quot;File&amp;quot;))&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:MainWindow.File_QMenu&amp;quot;, &amp;quot;New…&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
 # Edit-&amp;gt; Find -&amp;gt; Find…&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:MainWindow.menuBar_QMenuBar&amp;quot;, &amp;quot;Edit&amp;quot;))&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:MainWindow.Edit_QMenu&amp;quot;, &amp;quot;Find&amp;quot;))&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:Edit.Find_QMenu&amp;quot;, &amp;quot;Find…&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
 # Edit-&amp;gt; Find -&amp;gt; Advanced-&amp;gt; Find &amp;amp; Replace…&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:MainWindow.menuBar_QMenuBar&amp;quot;, &amp;quot;Edit&amp;quot;))&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:MainWindow.Edit_QMenu&amp;quot;, &amp;quot;Find&amp;quot;))&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:Edit.Find_QMenu&amp;quot;, &amp;quot;Advanced&amp;quot;))&lt;br /&gt;
 activateItem(waitForObjectItem(&amp;quot;:Find.Advanced_QMenu&amp;quot;, &amp;quot;Find &amp;amp; Replace…&amp;quot;))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code requires the menu objects, including the sub-menus, to be added to the object map, which in turn requires us to always record when interacting with a menu or sub-menu that Squish does not yet know about. With the real name approach, we can get around this.&lt;br /&gt;
&lt;br /&gt;
Adding support for any level of menu depth can be done by implementing a function that takes an arbitrary number of arguments, such as below:&lt;br /&gt;
&amp;lt;code&amp;gt;def activateMenuItem(*menuPath):&lt;br /&gt;
 menu = &amp;quot;:MainWindow.menuBar_QMenuBar&amp;quot;&lt;br /&gt;
 parent = &amp;quot;{name=&#039;MainWindow&#039; type=&#039;MainWindow&#039; visible=&#039;1&#039; windowTitle=&#039;MainWindow&#039;}&amp;quot;&lt;br /&gt;
 for item in menuPath[:–1]:&lt;br /&gt;
 activateItem(waitForObjectItem(menu, item))&lt;br /&gt;
 menu = &amp;quot;{title=&#039;%s&#039; type=&#039;QMenu&#039; visible=&#039;1&#039; window=s}&amp;quot; (item, parent)&lt;br /&gt;
 parent = menu&lt;br /&gt;
 activateItem(waitForObjectItem(menu, menuPath[–1]))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The code above only requires one object to be in the object map, and that is the menu bar. Of course, that can also be changed into a real name instead, if necessary.&lt;br /&gt;
&lt;br /&gt;
Usage would simply be:&lt;br /&gt;
&amp;lt;code&amp;gt; activateMenuItem(&amp;quot;File&amp;quot;, &amp;quot;New…&amp;quot;)&lt;br /&gt;
 activateMenuItem(&amp;quot;Edit&amp;quot;, &amp;quot;Find&amp;quot;, &amp;quot;Find…&amp;quot;)&lt;br /&gt;
 activateMenuItem(&amp;quot;Edit&amp;quot;, &amp;quot;Find&amp;quot;, &amp;quot;Advanced&amp;quot;, &amp;quot;Find &amp;amp; Replace…&amp;quot;)&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Working_with_Long_Test_Cases&amp;diff=32282</id>
		<title>Squish/Working with Long Test Cases</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Working_with_Long_Test_Cases&amp;diff=32282"/>
		<updated>2017-11-25T08:45:07Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: Working with long test cases]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::Working with long test cases Spanish|Español]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Working with long test cases =&lt;br /&gt;
&lt;br /&gt;
In the situation where you have very long test cases covering e.g. a specific workflow in your application, recording everything in one go could be troublesome as you normally are aiming for refactoring the recorded code into reusable functions. Trying to find specific actions among 500 lines of generated code is bound to be error-prone.&lt;br /&gt;
&lt;br /&gt;
One way of working around this problem is to have the application running in the background, record separate pieces of the workflow and refactor each piece after recording it.&lt;br /&gt;
&lt;br /&gt;
The way this is done is initially starting your application from Squish by clicking the &#039;&#039;Launch AUT&#039;&#039; button in the toolbar. Now, whenever you want to record something, you right-click in the test script where you want the recorded script to end up, and select &#039;&#039;Record snippet&#039;&#039; from the context menu. This will bring you into the application in recording mode.&lt;br /&gt;
&lt;br /&gt;
When you are done recording, DO NOT shut down the application, but click &#039;&#039;Stop recording&#039;&#039; in the control bar instead. This will bring you back to the IDE so you can refactor the recorded code. When you are done refactoring, you can right-click and select &#039;&#039;Record snippet&#039;&#039; again to start recording more interactions.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Hooking_into_Subprocesses&amp;diff=32281</id>
		<title>Squish/Hooking into Subprocesses</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Hooking_into_Subprocesses&amp;diff=32281"/>
		<updated>2017-11-25T08:44:54Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
Sometimes when writing Squish tests the application being tested launches a subprocess. In this short tip we&#039;ll see how to robustly connect to an externally launched subprocess on Windows.&lt;br /&gt;
&lt;br /&gt;
As the froglogic Squish manual (section 17.7.1) explains, hooking into an AUT&#039;s subprocess when on windows is slightly more complex, as Squish is not able to use LD_PRELOAD (or DYLD_INSERT_LIBRARIES on OS X) to insert the squish library hook into the launching executable. Two options to get around this are clear—the AUT sourcecode can be modified to optionally insert &amp;quot;dllpreload.exe&amp;quot; into the subprocess launch (as the squish manual explains), or the AUT can be modified to call an external shell script that does the optional prepending of &#039;dllpreload.exe&#039;.&lt;br /&gt;
&lt;br /&gt;
In any case, once the AUT has been modified to properly launch the subprocess, the squish test still needs to attach to the launching subprocess. If the AUT uses QProcess to launch the subprocess, it is enough to do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; subprocess = waitForApplicationLaunch()&amp;lt;/code&amp;gt;&lt;br /&gt;
However, if the squish IDE is set up to attach to the AUT manually, the desired call would be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; subprocess = attachToApplication( &amp;quot;APPNAME&amp;quot; )&amp;lt;/code&amp;gt;&lt;br /&gt;
However, the attachToApplication() call will throw an exception if the subprocess is not ready. So, a more robust way to give the subprocess time to launch properly is to try again in a loop for a predetermined amount of time:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; subprocess = 0&lt;br /&gt;
 count = 0&lt;br /&gt;
 while True:&lt;br /&gt;
 if count &amp;gt; 30:&lt;br /&gt;
 raise RuntimeError( &amp;quot;Attaching to AUT subprocess failed!&amp;quot; )&lt;br /&gt;
 try:&lt;br /&gt;
 subprocess = attachToApplication(&amp;quot;APPNAME&amp;quot;)&lt;br /&gt;
 break&lt;br /&gt;
 except:&lt;br /&gt;
 snooze(1)&lt;br /&gt;
 count += 1&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Using_Custom_Properties&amp;diff=32280</id>
		<title>Squish/Using Custom Properties</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Using_Custom_Properties&amp;diff=32280"/>
		<updated>2017-11-25T08:44:13Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Using Squish and custom properties =&lt;br /&gt;
&lt;br /&gt;
To fully test your application, there might be situations where you need to modify the application source code to add properties to specific widgets that can be tested from Squish. There are essentially two ways of doing this:&lt;br /&gt;
&lt;br /&gt;
== 1) Use the Q_PROPERTY macro ==&lt;br /&gt;
&lt;br /&gt;
If you have access to the source code for the widget you want to change, you can simply use the Q_PROPERTY macro to add a property to the widget:&lt;br /&gt;
&amp;lt;code&amp;gt;class MyWidget : public QWidget&lt;br /&gt;
{&lt;br /&gt;
 Q_OBJECT&lt;br /&gt;
 Q_PROPERTY(QString nameOfProperty READ getValue)&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
…&lt;br /&gt;
 QString getValue() const { return m_memberVar; }&lt;br /&gt;
…&lt;br /&gt;
private:&lt;br /&gt;
 QString m_memberVar;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This property will then be accessible in Squish using the Squish Spy just like any other widget property, and turned into a verification point simply by recording:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;waitFor(&amp;quot;object.exists(&#039;:NameOfObject&#039;)&amp;quot;, 20000)&lt;br /&gt;
object = findObject(&amp;quot;:NameOfObject&amp;quot;)&lt;br /&gt;
value = object.nameOfProperty&lt;br /&gt;
test.compare(value, &amp;quot;Expected value&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2) Use dynamic properties ==&lt;br /&gt;
&lt;br /&gt;
In the case where you do not have access to the source code for the widget, but instead only to the application using it, you cannot use the Q_PROPERTY approach as described above, but will need to use dynamic properties instead. This is essentially using the QObject::setProperty() function in the application source code to set the value of the property on the widget. This function takes two parameters, the name of the property (which you will later use from Squish) and the value to set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;myWidget-&amp;gt;setProperty(&amp;quot;nameOfProperty&amp;quot;, &amp;quot;Expected value&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The dynamic properties are however not seen automatically by Squish, so you cannot access them in the Squish Spy. Instead, we need to call the QObject::property() function to get the value. This is nothing different from calling other Qt functions from your Squish scripts:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;waitFor(&amp;quot;object.exists(&#039;:NameOfObject&#039;)&amp;quot;, 20000)&lt;br /&gt;
object = findObject(&amp;quot;:NameOfObject&amp;quot;)&lt;br /&gt;
value = object.property(&amp;quot;nameOfProperty&amp;quot;).toString()&lt;br /&gt;
test.compare(value, &amp;quot;Expected value&amp;quot;)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Generating_Test_Data&amp;diff=32279</id>
		<title>Squish/Generating Test Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Generating_Test_Data&amp;diff=32279"/>
		<updated>2017-11-25T08:44:00Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Generating test data =&lt;br /&gt;
&lt;br /&gt;
In the cases where you are testing an application that works with files, be it a file transfer application, editor or your own checksum calculator, you might benefit from testing it with different file types and/or file sizes. This article will show you how to generate these test files on-the-fly, so you will not have to keep them around in your revision control system where they simply take up space.&lt;br /&gt;
&lt;br /&gt;
Normally, when you work with test data in Squish, you will import some file using the IDE, which will copy that file into your suite_testsuite/tst_case/testdata or suite_testsuite/shared/testdata folder. You will then get it to your application using testData.put(). The beauty of testData.put() is that it also works across the network, if you are testing your application on e.g. an embedded system and have the squishrunner running on your local desktop machine.&lt;br /&gt;
&lt;br /&gt;
However, we can accomplish that even with generated files, without importing them using the IDE, and without copying them to the test system using testData.put(). This is because of Squish&#039;s built-in Qt bindings. As shown in various Squish articles in this wiki ([[:Category:Tools::Squish::Verifying_the_existence_of_a_menu_item | here]], [[:Category:Tools::Squish::Iterating_through_a_table | here]] and [[:Robust_selection_of_listview_or_treeview_items_with_variable_text | here]]) you can use the Qt classes and functions from within your test script, and we will use this support for generating the test files on the system where the AUT is being executed.&lt;br /&gt;
&lt;br /&gt;
The script can look something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;def createTestData(fileName, size):&lt;br /&gt;
 file = QFile(&amp;quot;s/%s&amp;quot; (currentApplicationContext().cwd, fileName))&lt;br /&gt;
 if file.open(QIODevice.WriteOnly):&lt;br /&gt;
 mb = 1024*1024&lt;br /&gt;
 if size &amp;gt; mb:&lt;br /&gt;
 mbData = QString()&lt;br /&gt;
 mbData.fill(&#039;a&#039;, mb)&lt;br /&gt;
 count = size / mb&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; count:&lt;br /&gt;
 file.write(mbData)&lt;br /&gt;
 i = i + 1&lt;br /&gt;
 rest = size % mb&lt;br /&gt;
 mbData.fill(&#039;a&#039;, rest)&lt;br /&gt;
 file.write(mbData)&lt;br /&gt;
 else:&lt;br /&gt;
 data = QString()&lt;br /&gt;
 data.fill(&#039;a&#039;, size)&lt;br /&gt;
 file.write(data)&lt;br /&gt;
 file.close()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage would be:&lt;br /&gt;
&amp;lt;code&amp;gt;createTestData(&amp;quot;test.txt&amp;quot;, 543872)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script simply generates a file with a specified file size and a specified file name, puts the file into the current working directory of the AUT, and fills it with the character &amp;quot;a&amp;quot;. As you can see from the function, it writes the data one megabyte at the time. This is to avoid allocating the full file size of data at once, hence getting the AUT to possibly consume a lot of the machines memory resources.&lt;br /&gt;
&lt;br /&gt;
The working directory where the files are put can be customized in the Test Suite Settings in the IDE, by simply changing the working directory of the AUT.&lt;br /&gt;
&lt;br /&gt;
Of course, this is only one way to actually generate the data. If you need more sophisticated data, or actually some proper content, you will of course have to modify this function. When doing so, just make sure to use the Qt API for creating the files and writing the data, as using Python&#039;s ditto will be executed in the context of the squishrunner (i.e. on your desktop machine), while using the Qt API it will be executed in the context of the AUT (i.e. the embedded device).&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Waiting_for_Input_from_the_Test_Operator&amp;diff=32278</id>
		<title>Squish/Waiting for Input from the Test Operator</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Waiting_for_Input_from_the_Test_Operator&amp;diff=32278"/>
		<updated>2017-11-25T08:43:24Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: waiting for input from the test operator]] if relevant}}&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Waiting for input from the test operator =&lt;br /&gt;
&lt;br /&gt;
In the cases where Squish cannot automate the whole test case, such as when a coin needs to be inserted into a slot machine or a physical button needs to be pressed which Squish cannot simulate, you need some way of notifying the test operator. As we have access to the whole Qt API from Squish, this can easily be done with a QMessageBox:&lt;br /&gt;
&amp;lt;code&amp;gt;QMessageBox.information(0, &amp;quot;Input needed&amp;quot;, &amp;quot;Please insert coin now!&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As the call to information() won&#039;t return until the user clicks the OK button, the script will be paused until that happens.&lt;br /&gt;
&lt;br /&gt;
We can also use Squish&#039;s powerful waitFor() command to continue the script immediately when the required action has occurred, without the user having to click a button, which can be useful in situations where an input cursor is not available for the test operator:&lt;br /&gt;
&amp;lt;/code&amp;gt;label = QLabel(&amp;quot;Please insert coin now!&amp;quot;)&lt;br /&gt;
label.show()&lt;br /&gt;
waitFor(&amp;quot;findObject(&#039;:CoinCounter_QLabel&#039;).text == &#039;1&#039;&amp;quot;)&lt;br /&gt;
label.close()&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Robust_Selection_of_View_Items_with_Variable_Text&amp;diff=32277</id>
		<title>Squish/Robust Selection of View Items with Variable Text</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Robust_Selection_of_View_Items_with_Variable_Text&amp;diff=32277"/>
		<updated>2017-11-25T08:43:12Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
This article is similiar to to [[Finding list items that ends in a given string]] however goes into a bit more detail and is also functional for treeviews as well as listviews. Dealing with a treeview requires careful handling of &amp;quot;.&amp;quot;-separated paths.&lt;br /&gt;
&lt;br /&gt;
Imagine you need to select some item in a treeview, but you don&#039;t know the exact string of the item as it may have changed. Alternatively maybe the parent item of the item you wish to select has changed, but the item is still the same. You need to find the item you want in the tree, and extract the correct Squish item identifier to interact with it later on.&lt;br /&gt;
&lt;br /&gt;
For example, assume you need to find a certain file in treeview, but the treeview has items with absolute paths that might be different on various machines. All you know is that the filename you are looking for will be the same, if it exists. You wish to iterate through the treeview, checking each level against some known valid path that you have. For this example, we will assume you have paths such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;server1\serverpath\some\path\test_data\test_project\filetest.db&lt;br /&gt;
server32\serverpath\some\path\test_data\test_project\filetest.db&lt;br /&gt;
C:_mirror\some\path\test_data\test_project\filetest.db&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and you can&#039;t be sure which path is in the treeview (potentially as a parent or child item). This means you might need to convert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;server1serverpathsomepathtestdatatestprojectfiletestb.subtem.subSubItem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C:localmirrorsomepathtestdatatestprojectfiletestb.subtem.subSubItem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Note that these paths are escaped so that Squish&#039;s itemview functions properly find the paths). As you can see, all three of the paths are the same from the &amp;quot;test_data&amp;quot; folder onwards, so we will use that to split between the &amp;quot;known good&amp;quot; parts of the path we wish to match, and the variable part we wish to replace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def findRealPath( treeviewname, origpath ):&lt;br /&gt;
 import re&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Original path: &amp;quot;, origpath&lt;br /&gt;
 treeView = waitForObject( treeviewname )&lt;br /&gt;
 model = treeView.model()&lt;br /&gt;
&lt;br /&gt;
# we are looking for this&lt;br /&gt;
 originalParts = origpath.split( &amp;quot;testdata&amp;quot; )&lt;br /&gt;
 pathOnly = originalParts[1]&lt;br /&gt;
 # Remove the items separated by &amp;quot;.&amp;quot; (but not . which is an escaped dot in the folder path)&lt;br /&gt;
 print &amp;quot;Now splitting items: s&amp;quot; re.split( &amp;quot;[&amp;lt;sup&amp;gt;].&amp;quot;, pathOnly, 1 )&lt;br /&gt;
 pieces = re.split( &amp;quot;[&amp;lt;/sup&amp;gt;].&amp;quot;, pathOnly, 1 ) # only split once&lt;br /&gt;
 pathOnly = pieces[ 0 ]&lt;br /&gt;
 childrenItems = &amp;quot;&amp;quot;&lt;br /&gt;
 if len( pieces ) &amp;gt; 1: # If this has children&lt;br /&gt;
 childrenItems = pieces[ 1 ]&lt;br /&gt;
 toplevel = model.rowCount( QModelIndex() )&lt;br /&gt;
 for row in range( toplevel ): # iterate through tree, looking for matching file&lt;br /&gt;
 # shortcut solution: check all top-level items in their first three columns. much more efficient if result is top-level&lt;br /&gt;
 for col in range( 3 ): # check first few columns&lt;br /&gt;
 idx = model.index( row, col, QModelIndex() )&lt;br /&gt;
 if checkModelItemReplacement(idx, pathOnly):&lt;br /&gt;
 return replaceModelIndex(utils.escape(str( idx.data( Qt.DisplayRole ).toString() )), childrenItems)&lt;br /&gt;
&lt;br /&gt;
# didn&#039;t find what we were looking for in the top level, do a search two more levels down&lt;br /&gt;
 # check all our children as well&lt;br /&gt;
 for col in range(20):&lt;br /&gt;
 idx = model.index( row, col, QModelIndex() )&lt;br /&gt;
 childCount = model.rowCount(idx)&lt;br /&gt;
 print &amp;quot;Checking children of item %s, found s&amp;quot; (idx.data(Qt.DisplayRole).toString(), childCount)&lt;br /&gt;
 for childRow in range(childCount):&lt;br /&gt;
 child = model.index( 0, 0, idx )&lt;br /&gt;
 print &amp;quot;checking child %s: s&amp;quot; (childRow, child.data(Qt.DisplayRole).toString())&lt;br /&gt;
 if checkModelItemReplacement(child, pathOnly):&lt;br /&gt;
 # we need to do the replacement differently, because we need to keep the parent in the path&lt;br /&gt;
 partpieces = re.split( &amp;quot;([&amp;lt;sup&amp;gt;]).&amp;quot;, origpath )&lt;br /&gt;
 # find the index that has the test_data/ path. all indexes before that are parents&lt;br /&gt;
 for i in range(len(partpieces)):&lt;br /&gt;
 if &amp;quot;testdata&amp;quot; in partpieces[i]: # stop here&lt;br /&gt;
 # since we split on [&amp;lt;/sup&amp;gt;]. and captured the split text, we need to condense each pair of items&lt;br /&gt;
 num = i/2&lt;br /&gt;
 parentItems = []&lt;br /&gt;
 for k in range(num):&lt;br /&gt;
 parentItems.append( partpieces[k] + partpieces[k+1] ) # rescue the char lost when splitting&lt;br /&gt;
 parentstr = &amp;quot;.&amp;quot;.join(parentItems)&lt;br /&gt;
 return replaceModelIndex(utils.escape(str( child.data( Qt.DisplayRole ).toString() )), childrenItems, parentstr)&lt;br /&gt;
&lt;br /&gt;
# we failed&lt;br /&gt;
 print &amp;quot;Failed to replace: s&amp;quot; origpath&lt;br /&gt;
 return origpath&lt;br /&gt;
&lt;br /&gt;
# used internally by above&lt;br /&gt;
def checkModelItemReplacement( idx, pathOnly ):&lt;br /&gt;
 contents = utils.escape(str( idx.data( Qt.DisplayRole ).toString() ))&lt;br /&gt;
 print &amp;quot;Checking for %s in s&amp;quot; (pathOnly, contents)&lt;br /&gt;
 if pathOnly in contents: # this is the entry we are looking for&lt;br /&gt;
 return True&lt;br /&gt;
 else:&lt;br /&gt;
 return False&lt;br /&gt;
&lt;br /&gt;
# used internally by above&lt;br /&gt;
def replaceModelIndex( contents, children, parents = &amp;quot;&amp;quot; ):&lt;br /&gt;
 print &amp;quot;Replacing with %s and %s with parent? s&amp;quot; (contents, children, parents)&lt;br /&gt;
 replaced = contents&lt;br /&gt;
&lt;br /&gt;
if children [[Image:= &amp;quot;&amp;quot;:&lt;br /&gt;
        replaced += &amp;quot;.&amp;quot; + children&lt;br /&gt;
        print &amp;quot;added children to replaced: %s&amp;quot; % replaced&lt;br /&gt;
    if parents |]]= &amp;quot;&amp;quot;:&lt;br /&gt;
 replaced = parents + &amp;quot;.&amp;quot; + replaced&lt;br /&gt;
 print &amp;quot;added parents to replaced: s&amp;quot; replaced&lt;br /&gt;
 return replaced&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As is visible in the above code sample, this code only searches three-levels-deep for a match. If your tree is deeper than 3 levels, you&#039;ll need to either add another level of drilling down, or convert it into recursive function that works on any arbitrary level. The above code can be used like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;treeViewName = &amp;quot;:Your_treeview_here&amp;quot;&lt;br /&gt;
itemPath = &amp;quot;server1serverpathsomepathtestdatatestprojectfiletestb.subtem.subSubItem&amp;quot;&lt;br /&gt;
realItemPath = findRealPath( treeViewName, itemPath )&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Finding_List_Items_that_End_in_a_Given_String/es&amp;diff=32276</id>
		<title>Squish/Finding List Items that End in a Given String/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Finding_List_Items_that_End_in_a_Given_String/es&amp;diff=32276"/>
		<updated>2017-11-25T08:42:54Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: finding list items that end in a given string/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::Finding list items that ends in a given string|English]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= Buscando elementos de una lista que terminan en una cadena dada =&lt;br /&gt;
&lt;br /&gt;
Como Squish utiliza el texto completo del artículo para la identificación de los elementos de un list view, esto podría causar problemas cuando el comienzo del texto del elemento es diferente en función de por ejemplo la máquina que está ejecutando el caso de la prueba.&lt;br /&gt;
&lt;br /&gt;
Una solución a esto podría ser buscar los items que terminan con una cadena dada, para evitar incluir la cadena con el prefijo cambiado. Esto se puede hacer usando la función que se muestra debajo, la misma hace click en un elemento que termina en una cadena dada en una columna especifica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def clickListItem(obj, endValue, column):&lt;br /&gt;
 model = waitForObject(obj).model()&lt;br /&gt;
 rows = model.rowCount()&lt;br /&gt;
&lt;br /&gt;
for i in range(rows):&lt;br /&gt;
 itemString=str(model.data(model.index(i, column), Qt.DisplayRole).toString())&lt;br /&gt;
&lt;br /&gt;
if itemString.endswith(endValue):&lt;br /&gt;
 waitForObjectItem(obj, itemString)&lt;br /&gt;
 clickItem(obj, itemString, 0, 0, 0, Qt.LeftButton)&lt;br /&gt;
 return&lt;br /&gt;
&lt;br /&gt;
test.fatal(&amp;quot;Could not find item with end value: &amp;quot; + endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para seleccionar un item que termine con el string &amp;quot;value1&amp;quot; en una list view especifica, usamos:&lt;br /&gt;
&amp;lt;code&amp;gt;clickListItem(&amp;quot;:MyQListView&amp;quot;, &amp;quot;value1&amp;quot;, 0)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Verifying_the_Value_of_a_QLabel&amp;diff=32275</id>
		<title>Squish/Verifying the Value of a QLabel</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Verifying_the_Value_of_a_QLabel&amp;diff=32275"/>
		<updated>2017-11-25T08:41:41Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: verifying the value of a QLabel]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::VerifyingTheValueOfAQLabelSpanish|Español]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Verifying the value of a QLabel =&lt;br /&gt;
&lt;br /&gt;
In some applications you might show dynamic data in QLabel and you want the value of this QLabel to be verified during playback. The problem however is that Squish uses the text property of QLabel to identify the QLabel object, which works just fine as long as the value is the expected value. But as soon as the value of the QLabel changes, Squish won&#039;t be able to find your QLabel and instead of a verification failure at playback you have a playback error due to a missing object.&lt;br /&gt;
&lt;br /&gt;
This problem can be solved by not using the text property for identification of that QLabel. This is done by opening the Object Map, selecting the affected QLabel and remove the text property in the list of properties being shown. This will however only solve the problem for this specific label. If you have several more labels being affected by this, it might be a better idea to add a permanent solution, to avoid doing this manual work for every label.&lt;br /&gt;
&lt;br /&gt;
This is done by adding a file called qtwrapper_user_descriptors.xml to your ~/.squish folder (APPDATAon Windows) with the following content:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;objectdescriptors&amp;gt;&lt;br /&gt;
 &amp;lt;descriptor&amp;gt;&lt;br /&gt;
 &amp;lt;type name=&amp;quot;QLabel&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;realidentifiers&amp;gt;&lt;br /&gt;
 &amp;lt;property exclude=&amp;quot;yes&amp;quot;&amp;gt;text&amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/realidentifiers&amp;gt;&lt;br /&gt;
 &amp;lt;/descriptor&amp;gt;&lt;br /&gt;
&amp;lt;/objectdescriptors&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Load_Testing&amp;diff=32274</id>
		<title>Squish/Load Testing</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Load_Testing&amp;diff=32274"/>
		<updated>2017-11-25T08:41:23Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Load testing with Squish =&lt;br /&gt;
&lt;br /&gt;
Let&#039;s assume you have an application that communicates with a separate server, let it be a web server, a Jabber server or a custom developed server only for your application. Using Squish, you can load test this server with your application as the entry point. This is done by running Squish multiple times in parallel on multiple instances of your application working against the same server.&lt;br /&gt;
&lt;br /&gt;
To accomplish the load testing, you need two different scripts: the actual test script that will run on each application instance and a launch script that will start off the requested number of Squish instances.&lt;br /&gt;
&lt;br /&gt;
== 1) The test script ==&lt;br /&gt;
&lt;br /&gt;
The content of the test script is of course very dependent of the application you are testing, but one general concept is that you put the interactions in a loop doing a pre-defined number of iterations. For the sake of this example, we will use the fortune client and threaded fortune server available in your Qt installation. The test will simply be repetetive clicking of the &amp;quot;Get Fortune&amp;quot; button, verifying that the fortune text is updated within a specific period of time, in the below case 20 milliseconds. The script assumes the fortune server is already running.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def main():&lt;br /&gt;
 startApplication(&amp;quot;fortuneclient&amp;quot;)&lt;br /&gt;
 type(waitForObject(&amp;quot;:Server port:_QLineEdit&amp;quot;), &amp;quot;41868&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
labelName = &amp;quot;{type=&#039;QLabel&#039; unnamed=&#039;1&#039; visible=&#039;1&#039; window=&#039;:Fortune Client_Client&#039; occurrence=&#039;3&#039;}&amp;quot;&lt;br /&gt;
 waitFor(&amp;quot;object.exists(labelName)&amp;quot;, 20000)&lt;br /&gt;
 label = findObject(labelName)&lt;br /&gt;
&lt;br /&gt;
prevText = label.text&lt;br /&gt;
&lt;br /&gt;
for i in range(100):&lt;br /&gt;
 clickButton(waitForObject(&amp;quot;:Fortune Client.Get Fortune_QPushButton&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
time = QTime()&lt;br /&gt;
 time.start()&lt;br /&gt;
 waitFor(&amp;quot;label.text != prevText&amp;quot;)&lt;br /&gt;
 elapsed = time.elapsed()&lt;br /&gt;
 test.verify(elapsed &amp;lt; 20)&lt;br /&gt;
&lt;br /&gt;
prevText = label.text&lt;br /&gt;
&lt;br /&gt;
clickButton(waitForObject(&amp;quot;:Fortune Client.Quit_QPushButton&amp;quot;))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2) The launch script ==&lt;br /&gt;
&lt;br /&gt;
This script can be written in any scripting language of your choice. The main purpose of it though is to launch ONE Squish server and an arbitrary number of Squish runners all running the script above. The script below does that, in Python, launching 50 Squish runners.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
SQUISHDIR=&amp;quot;/path/to/squish-4.1.0-qt-src&amp;quot;&lt;br /&gt;
TESTSUITEDIR=&amp;quot;/path/to/suite_loadTesting&amp;quot;&lt;br /&gt;
TESTCASE=&amp;quot;tst_case1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subprocess.Popen([&amp;quot;s/bin/squishserver&amp;quot; SQUISHDIR, &amp;quot;—daemon&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
for i in range(50):&lt;br /&gt;
 subprocess.Popen([&amp;quot;s/bin/squishrunner&amp;quot; SQUISHDIR, &amp;quot;—testsuite&amp;quot;, TESTSUITEDIR, &amp;quot;—testcase&amp;quot;, TESTCASE])&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
&lt;br /&gt;
One problem with the above approach is that the test script will launch immediately when the Squish runner is launched, which is normally what you want. However, this means some of the application instances are finished by the time other start. This can be worked around by having the test script wait for a specific file to exist before entering the loop, and having the launch script create this file after all Squish runners has started. That way, the actual load testing won&#039;t start until all the clients are ready.&lt;br /&gt;
&lt;br /&gt;
You may also want to introduce random snoozing between each iteration in the test script, to even out the load on the client machine and also making the load on the server machine more &amp;quot;human&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to run more application instances than what is feasable on a single host, using Squish&#039;s remote testing you can execute multiple application instances on multiple different hosts. This of course still means running the Squish runners on one machine, but at least you reduce the load introduced by the application you are testing. An alternative of course is to execute the Squish runners remotely over e.g. SSH on multiple machines to spread the load even more.&lt;br /&gt;
&lt;br /&gt;
Technically, you could be using multiple Squish servers (e.g. one per application instance), but as a single server is handling multiple Squish runners quite well, there is really no need for it, and it will actually increase system load on the client machine.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Finding_List_Items_that_End_in_a_Given_String&amp;diff=32273</id>
		<title>Squish/Finding List Items that End in a Given String</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Finding_List_Items_that_End_in_a_Given_String&amp;diff=32273"/>
		<updated>2017-11-25T08:41:10Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: finding list items that end in a given string]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::FindingListItemsThatEndsInAGivenStringSpanish|Español]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Finding list items that ends in a given string =&lt;br /&gt;
&lt;br /&gt;
As Squish uses the full item text for identifying items in a list view, this could cause problems when&lt;br /&gt;
the beginning of the item text is different based on e.g. which machine you are running the test case.&lt;br /&gt;
&lt;br /&gt;
One solution to this could be to look for items ending with a given string, to avoid including&lt;br /&gt;
the changing string prefix. This can be done with the utility function below, which clicks an item&lt;br /&gt;
that ends in a given string in a given column:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def clickListItem(obj, endValue, column):&lt;br /&gt;
 model = waitForObject(obj).model()&lt;br /&gt;
 rows = model.rowCount()&lt;br /&gt;
&lt;br /&gt;
for i in range(rows):&lt;br /&gt;
 itemString=str(model.data(model.index(i, column), Qt.DisplayRole).toString())&lt;br /&gt;
&lt;br /&gt;
if itemString.endswith(endValue):&lt;br /&gt;
 waitForObjectItem(obj, itemString)&lt;br /&gt;
 clickItem(obj, itemString, 0, 0, 0, Qt.LeftButton)&lt;br /&gt;
 return&lt;br /&gt;
&lt;br /&gt;
test.fatal(&amp;quot;Could not find item with end value: &amp;quot; + endValue)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selecting an item that ends in the string &amp;quot;value1&amp;quot; in a specific list view is then done by doing:&lt;br /&gt;
&amp;lt;code&amp;gt;clickListItem(&amp;quot;:MyQListView&amp;quot;, &amp;quot;value1&amp;quot;, 0)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Verifying_the_Value_of_a_QLabel/es&amp;diff=32272</id>
		<title>Squish/Verifying the Value of a QLabel/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Verifying_the_Value_of_a_QLabel/es&amp;diff=32272"/>
		<updated>2017-11-25T08:38:32Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: Verifying The Value of a QLabel/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::Verifying the value of a QLabel|English]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= Verificando el valor de una QLabel =&lt;br /&gt;
&lt;br /&gt;
En algunas aplicaciones necesitaras mostrar datos dinámicos en un QLabel y verificar el valor de este QLabel durante la reproducción. El problema sin embargo es que Squish utiliza la propiedad text de QLabel para identificar el objeto QLabel, esto funciona muy bien siempre y cuando el valor sea el valor esperado. Pero tan pronto como el valor de el QLabel cambia, Squish no será capaz de encontrar al QLabel y en lugar de mostrar un error de verificación durante la reproducción obtendrá un error de reproducción debido a un objeto perdido.&lt;br /&gt;
&lt;br /&gt;
Este problema puede ser resuelto no usando la propiedad de texto para la identificación de el QLabel. Esto se hace abriendo el Mapa de Objetos, seleccionando el QLabel afectado y quitando la propiedad texto en la lista de propiedades que se muestran. Esto sin embargo, sólo resuelve el problema para esta label específica. Si usted tiene varias labels afectados por esto, podría ser una mejor idea agregar una solución permanente, para evitar hacer este trabajo manualmente para cada label.&lt;br /&gt;
&lt;br /&gt;
Esto se hace mediante la adición de un archivo llamado qtwrapper_user_descriptors.xml a nuestrar carpeta ~/.squish (APPDATAen Windows) con el siguiente contenido:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;objectdescriptors&amp;gt;&lt;br /&gt;
 &amp;lt;descriptor&amp;gt;&lt;br /&gt;
 &amp;lt;type name=&amp;quot;QLabel&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;realidentifiers&amp;gt;&lt;br /&gt;
 &amp;lt;property exclude=&amp;quot;yes&amp;quot;&amp;gt;text&amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/realidentifiers&amp;gt;&lt;br /&gt;
 &amp;lt;/descriptor&amp;gt;&lt;br /&gt;
&amp;lt;/objectdescriptors&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Using_a_Decorator_to_Profile_Tests&amp;diff=32271</id>
		<title>Squish/Using a Decorator to Profile Tests</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Using_a_Decorator_to_Profile_Tests&amp;diff=32271"/>
		<updated>2017-11-25T08:38:14Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
== Use a decorator to profile tests ==&lt;br /&gt;
&lt;br /&gt;
If your Squish tests are very intensive, or you have hundreds of them, you can run them trough a profiler from time to time. This will enable you to see where you&#039;re spending most of your time and will help optimize your efforts.&lt;br /&gt;
&lt;br /&gt;
In order to do this you will need to run your main function through the python profiling package cProfile. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def main():&lt;br /&gt;
 pass&lt;br /&gt;
&lt;br /&gt;
import cProfile&lt;br /&gt;
profile = cProfile.Profile()&lt;br /&gt;
profile.runcall(main)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on your particular configuration, the previous code might lead you to run the test twice. To avoid the repetition, wrap your main function with a decorator instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;import decorator&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;decorator.profile&lt;br /&gt;
def main():&lt;br /&gt;
 pass&lt;br /&gt;
&lt;br /&gt;
#in the decorator file&lt;br /&gt;
def profile(func):&lt;br /&gt;
 def inner():&lt;br /&gt;
 import cProfile&lt;br /&gt;
 p = cProfile.Profile()&lt;br /&gt;
 p.runcall(func)&lt;br /&gt;
 #do something to report the result&lt;br /&gt;
&lt;br /&gt;
return inner&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Iterating_Through_a_Table/es&amp;diff=32270</id>
		<title>Squish/Iterating Through a Table/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Iterating_Through_a_Table/es&amp;diff=32270"/>
		<updated>2017-11-25T08:38:02Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: iterating through a table/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::Iterating through a table|English]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= Iterando a través de una tabla =&lt;br /&gt;
&lt;br /&gt;
Hay varias formas de recorrer una tabla con script de test para utilizarlo cuando se necesita verificar o tomar una decisión sobre un determinado conjunto de filas o columnas. En los siguientes ejemplos vamos a utilizar los tres métodos para verificar que no hay celdas vacías en una tabla.&lt;br /&gt;
&lt;br /&gt;
Al final, el uso de cualquiera de estos tres enfoques sería simplemente:&lt;br /&gt;
&amp;lt;code&amp;gt;verifyNoEmptyCells(&amp;quot;:MyQTableWidget&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usando la API de Qt ==&lt;br /&gt;
&lt;br /&gt;
Este acercamiento usa la API de Qt para acceder al modelo directamente e iterar entre las filas y las columnas de la tabla.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def verifyNoEmptyCells(tableName):&lt;br /&gt;
 table = waitForObject(tableName)&lt;br /&gt;
 model = table.model()&lt;br /&gt;
 columnCount = model.columnCount()&lt;br /&gt;
 rowCount = model.rowCount()&lt;br /&gt;
&lt;br /&gt;
for col in range(columnCount):&lt;br /&gt;
 for row in range(rowCount):&lt;br /&gt;
 itemText = str(model.data(model.index(row, col), Qt.DisplayRole).toString())&lt;br /&gt;
 test.verify(itemText != &amp;quot;&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usando waitForObjectItem() ==&lt;br /&gt;
&lt;br /&gt;
Usando waitForObjectItem() se puede acceder a items de un widget especifico, tales como las acciones en un menú o en este caso, las celdas de una tabla. Se necesitan dos parámetros, el primero es el nombre del objeto primario y el segundo es la identificación del elemento. Para las celdas de una tabla, que es de dos números enteros en forma de fila / columna.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def verifyNoEmptyCells(tableName):&lt;br /&gt;
 table = waitForObject(tableName)&lt;br /&gt;
 columnCount = table.columnCount&lt;br /&gt;
 rowCount = table.rowCount&lt;br /&gt;
&lt;br /&gt;
for col in range(columnCount):&lt;br /&gt;
 for row in range(rowCount):&lt;br /&gt;
 item = waitForObjectItem(tableName, str(row)+&amp;quot;/&amp;quot;&#039;&#039;str(col))&lt;br /&gt;
 test.verify(item.text != &amp;quot;&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usando nombres reales ==&lt;br /&gt;
Squish ofrece dos formas de identificar los objetos en un script de tests, ya sea usando el nombre simbólico que se asigna a una entrada en el mapa del objetos, o usar el nombre real que muestra todas las propiedades y su valor esperado en una cadena de identificación. Detrás de escena, el nombre simbólico se mapea al nombre real, usando el nombre simbólico generalmente hace que el script sea más legible.&lt;br /&gt;
&lt;br /&gt;
Al utilizar el nombre real para identificar las celdas, podemos cambiar los valores esperados de las propiedades y por lo tanto el acceso a las diferentes celdas de la tabla como se ve a continuación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def verifyNoEmptyCells(tableName):&lt;br /&gt;
 waitFor(&amp;quot;object.exists(tableName)&amp;quot;)&lt;br /&gt;
 columnCount = findObject(tableName).columnCount&lt;br /&gt;
 rowCount = findObject(tableName).rowCount&lt;br /&gt;
&lt;br /&gt;
 for col in range(columnCount):&lt;br /&gt;
 for row in range(rowCount):&lt;br /&gt;
 item = waitForObject(&amp;quot;{column=&#039;&amp;quot;&#039;&#039; str(col) + &amp;quot;&#039; container=&#039;&amp;quot; + tableName + &amp;quot;&#039; row=&#039;&amp;quot; + str(row) + &amp;quot;&#039; type=&#039;QModelIndex&#039;}&amp;quot;)&lt;br /&gt;
 test.verify(item.text != &amp;quot;&amp;quot;)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Enumerating_all_Objects_Matching_a_Pattern&amp;diff=32269</id>
		<title>Squish/Enumerating all Objects Matching a Pattern</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Enumerating_all_Objects_Matching_a_Pattern&amp;diff=32269"/>
		<updated>2017-11-25T08:37:35Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
== Enumerating all objects matching a pattern ==&lt;br /&gt;
&lt;br /&gt;
When using Squish&#039;s pattern lookup functionality, it is often useful to perform an operation on all occurrences of an object matching a Squish pattern. The following function will let you enumerate all occurrences matching a pattern like you would any Python collection:&lt;br /&gt;
&lt;br /&gt;
This function will yield all of the objects matching the specified pattern, by occurrence unless an alternative field to enumerate is provided with &#039;%i&#039; as its value.&lt;br /&gt;
&amp;lt;code&amp;gt;def enumerateObjects(pattern):&lt;br /&gt;
 #allow %i to be specified manually, e.g. to check rows in a model one could do&lt;br /&gt;
 #enumerateObjects(&amp;quot;{column=&#039;0&#039; container=&#039;:containerObject&#039; row=&#039;%i&#039; type=&#039;QModelIndex&#039;}&amp;quot;)&lt;br /&gt;
 if &#039;%i&#039; not in pattern:&lt;br /&gt;
 if not pattern.endswith(&#039;}&#039;): #invalid pattern&lt;br /&gt;
 raise RuntimeError(&amp;quot;Pattern &#039;s&#039; is invalid!&amp;quot; pattern)&lt;br /&gt;
 pattern = pattern[:–1] + &amp;quot; occurrence=&#039;i&#039;}&amp;quot;&lt;br /&gt;
 i = 1&lt;br /&gt;
 while True:&lt;br /&gt;
 try:&lt;br /&gt;
 #return objects until a LookupError occurs&lt;br /&gt;
 yield findObject(pattern i)&lt;br /&gt;
 except:&lt;br /&gt;
 return&lt;br /&gt;
 i += 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a usage example, to log the contents of all &#039;&#039;&#039;QLabel&#039;&#039;&#039; widgets with parent :foo, you would do:&lt;br /&gt;
&amp;lt;code&amp;gt;for label in enumerateObjects(&amp;quot;{type=&#039;QLabel&#039; parent=&#039;:foo&#039;}&amp;quot;):&lt;br /&gt;
 test.log(str(label.text()))&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Working_with_Long_Test_Cases/es&amp;diff=32268</id>
		<title>Squish/Working with Long Test Cases/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Working_with_Long_Test_Cases/es&amp;diff=32268"/>
		<updated>2017-11-25T08:35:50Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: Working with long test cases/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::Working with long test cases|English]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= Trabajando con grandes casos de pruebas =&lt;br /&gt;
&lt;br /&gt;
In the situation where you have very long test cases covering e.g. a specific workflow in your application, recording everything in one go could be troublesome as you normally are aiming for refactoring the recorded code into reusable functions. Trying to find specific actions among 500 lines of generated code is bound to be error-prone.&lt;br /&gt;
&lt;br /&gt;
En la situación en la que se tienen casos de prueba muy grandes, que abarcan por ejemplo un flujo de trabajo específico en su aplicación, grabarlo todo de una vez podría ser un problema, es recomendable refactorizar en el código grabado en funciones reutilizables. Tratar de encontrar acciones específicas entre 500 líneas de código generado está destinado a ser un proceso propenso a errores.&lt;br /&gt;
&lt;br /&gt;
Una forma de solucionar este problema es tener la aplicación en segundo plano, grabando las piezas del flujo de trabajo por separado y refactorizando cada pieza después de la grabación.&lt;br /&gt;
&lt;br /&gt;
La manera de hacer esto es iniciar su aplicación desde Squish haciendo clic en el botón &#039;&#039;Launch AUT&#039;&#039; en la barra de herramientas. Ahora cada vez que desee grabar algo, pulsa el con el botón derecho en el script del test, seleccione &#039;&#039;Record snippet&#039;&#039; en el menu contextual. Esto le llevará a la aplicación en modo de grabación.&lt;br /&gt;
&lt;br /&gt;
Cuando haya terminado de grabar, NO cierre la aplicación, sino que haga clic en &#039;&#039;Stop recording&#039;&#039; en la barra de control. Esto le llevará de nuevo al IDE para que pueda refactorizar el código grabado. Cuando haya terminado la refactorización, puede hacer click derecho y seleccionar &#039;&#039;Record snippet&#039;&#039; de nuevo para iniciar la grabación de mas interaciones.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Using_Helper_Objects&amp;diff=32267</id>
		<title>Squish/Using Helper Objects</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Using_Helper_Objects&amp;diff=32267"/>
		<updated>2017-11-25T08:34:04Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Using Helper Objects =&lt;br /&gt;
&lt;br /&gt;
When writing a Squish test, it is often helpful to provide a helper object in your application code to provide information your test can&#039;t easily access. A helper object, in this context, is a QObject that provides methods useful to Squish tests that is instantiated in the application for Squish to find. A helper object may be a good fit if you&#039;re trying to verify application state that can&#039;t easily be checked using native Qt and Squish functions.&lt;br /&gt;
&lt;br /&gt;
As a contrived example, it might be useful to provide a helper object to get the color of a model rendered in a QGLWidget instead of trying to use a screenshot verification. Ideally a helper object&#039;s methods should &#039;&#039;not&#039;&#039; have side effects, as an ideal Squish test should only be testing what a user can do with normal input.&lt;br /&gt;
&lt;br /&gt;
== An Example C++ Helper Object ==&lt;br /&gt;
&lt;br /&gt;
The following class definition provides the method &#039;&#039;&#039;SquishHelper::help&#039;&#039;&#039;, which Squish can invoke and get an integer result from. Note that &#039;&#039;&#039;SquishHelper::help&#039;&#039;&#039; is flagged as &#039;&#039;&#039;Q_INVOKABLE&#039;&#039;&#039;, this is important! A method used by Squish must be accessible via Qt&#039;s metaobject system, which means methods that are either slots or &#039;&#039;&#039;Q_INVOKABLE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;lt;QObject&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class SquishHelper : public QObject&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
 SquishHelper(QObject* parent);&lt;br /&gt;
 ~SquishHelper();&lt;br /&gt;
&lt;br /&gt;
Q_INVOKABLE int help() const; //only offer a non-const method if you have a good reason&lt;br /&gt;
};&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After defining the class, merely instantiate it somewhere and optionally give it a name if there may be multiple instances. Make sure that the QObject parent of the helper object is a GUI element Squish shows in its object tree for the application, such as the main window. This ensures that Squish can successfully look up the object later.&lt;br /&gt;
&amp;lt;code&amp;gt;…&lt;br /&gt;
SquishHelper* helper = new SquishHelper(this);&lt;br /&gt;
helper-&amp;gt;setName(&amp;quot;Helper1&amp;quot;);&lt;br /&gt;
…&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using a Helper Object From Squish ==&lt;br /&gt;
&lt;br /&gt;
With the above helper object, looking up and invoking methods on the object is trivial. For instance, to look up the object and check the result of help in Python, you could do:&lt;br /&gt;
&amp;lt;code&amp;gt;…&lt;br /&gt;
helper = findObject(&amp;quot;{name=&#039;Helper1&#039; type=&#039;SquishHelper&#039;}&amp;quot;)&lt;br /&gt;
test.compare(helper.help(), 0)&lt;br /&gt;
…&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Navigating_a_QDateEdit&amp;diff=32266</id>
		<title>Squish/Navigating a QDateEdit</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Navigating_a_QDateEdit&amp;diff=32266"/>
		<updated>2017-11-25T08:33:51Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Navigating a QDateEdit =&lt;br /&gt;
&lt;br /&gt;
Interacting with a QDateEdit from a Squish script is a bit more involved than just clicking a button or writing some text into a line edit, especially if you want a nice scripting API for it as well. Below is a script function that you can cut-and-paste into your existing test case or shared script, and use without modifications. It requires you to have recorded one interaction with a QDateEdit though, to have the proper names in the object map.&lt;br /&gt;
&lt;br /&gt;
Usage would be:&lt;br /&gt;
&amp;lt;code&amp;gt;setDate(&amp;quot;:nameOfQDateEdit&amp;quot;, &amp;quot;2011&amp;quot;, &amp;quot;April&amp;quot;, &amp;quot;1&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def setDate(dateedit, year, month, day):&lt;br /&gt;
 waitFor(&amp;quot;object.exists(dateedit)&amp;quot;, 20000)&lt;br /&gt;
&lt;br /&gt;
dateExpandX = findObject(dateedit).width - 10&lt;br /&gt;
 sendEvent(&amp;quot;QMouseEvent&amp;quot;, waitForObject(dateedit), QEvent.MouseButtonPress, dateExpandX, 15, Qt.LeftButton, 0)&lt;br /&gt;
 sendEvent(&amp;quot;QMouseEvent&amp;quot;, waitForObject(dateedit), QEvent.MouseButtonRelease, dateExpandX, 15, Qt.LeftButton, 0)&lt;br /&gt;
&lt;br /&gt;
yearToolButtonName = &amp;quot;{name=&#039;qt_calendar_yearbutton&#039; type=&#039;QToolButton&#039; visible=&#039;1&#039; window=&#039;:qt_datetimedit_calendar_QCalendarPopup&#039;}&amp;quot;&lt;br /&gt;
 clickButton(waitForObject(yearToolButtonName))&lt;br /&gt;
&lt;br /&gt;
yearEditSpinBoxName = &amp;quot;{name=&#039;qt_calendar_yearedit&#039; type=&#039;QSpinBox&#039; visible=&#039;1&#039; window=&#039;:qt_datetimedit_calendar_QCalendarPopup&#039;}&amp;quot;&lt;br /&gt;
 type(waitForObject(yearEditSpinBoxName), year)&lt;br /&gt;
 type(waitForObject(yearEditSpinBoxName), &amp;quot;&amp;lt;Return&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
monthToolButtonName = &amp;quot;{name=&#039;qt_calendar_monthbutton&#039; type=&#039;QToolButton&#039; visible=&#039;1&#039; window=&#039;:qt_datetimedit_calendar_QCalendarPopup&#039;}&amp;quot;&lt;br /&gt;
 clickButton(waitForObject(monthToolButtonName))&lt;br /&gt;
&lt;br /&gt;
monthMenuName = &amp;quot;{type=&#039;QMenu&#039; unnamed=&#039;1&#039; visible=&#039;1&#039; window=&#039;:qt_datetimedit_calendar_QCalendarPopup&#039;}&amp;quot;&lt;br /&gt;
 activateItem(waitForObjectItem(monthMenuName, month))&lt;br /&gt;
&lt;br /&gt;
calendarViewName = &amp;quot;{name=&#039;qt_calendar_calendarview&#039; type=&#039;QCalendarView&#039; visible=&#039;1&#039; window=&#039;:qt_datetimedit_calendar_QCalendarPopup&#039;}&amp;quot;&lt;br /&gt;
 waitFor(&amp;quot;object.exists(calendarViewName)&amp;quot;, 20000)&lt;br /&gt;
 model = findObject(calendarViewName).model()&lt;br /&gt;
 seenOne = False&lt;br /&gt;
 for row in range(1, model.rowCount() - 1): # First row contains day names, let&#039;s skip it&lt;br /&gt;
 for col in range(model.columnCount()):&lt;br /&gt;
 dayText = model.data(model.index(row, col)).toString()&lt;br /&gt;
&lt;br /&gt;
if dayText == &amp;quot;1&amp;quot;: # Some dates from last month may be seen, so make sure we&#039;ve iterated&lt;br /&gt;
 seenOne = True # past them before we actually click an item&lt;br /&gt;
&lt;br /&gt;
if seenOne and dayText == day:&lt;br /&gt;
 waitForObjectItem(calendarViewName, &amp;quot;s/%s&amp;quot; (row, col))&lt;br /&gt;
 clickItem(calendarViewName, &amp;quot;s/%s&amp;quot; (row, col), 14, 11, 0, Qt.LeftButton)&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Iterating_Through_a_Table&amp;diff=32265</id>
		<title>Squish/Iterating Through a Table</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Iterating_Through_a_Table&amp;diff=32265"/>
		<updated>2017-11-25T08:33:33Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: iterating through a table]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::IteratingThroughATableSpanish|Español]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Iterating through a table =&lt;br /&gt;
&lt;br /&gt;
There are several ways to iterate through a table in your test script to be used when you need to verify or take action on a given set of rows or columns. In the examples below we will use all three approaches to verify that there are no empty cells in a table.&lt;br /&gt;
&lt;br /&gt;
In the end, the usage of any of these three approaches would simply be:&lt;br /&gt;
&amp;lt;code&amp;gt;verifyNoEmptyCells(&amp;quot;:MyQTableWidget&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Qt API approach ==&lt;br /&gt;
&lt;br /&gt;
This approach uses the Qt API to access the model directly and iterate through the rows and columns of the table.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def verifyNoEmptyCells(tableName):&lt;br /&gt;
 table = waitForObject(tableName)&lt;br /&gt;
 model = table.model()&lt;br /&gt;
 columnCount = model.columnCount()&lt;br /&gt;
 rowCount = model.rowCount()&lt;br /&gt;
&lt;br /&gt;
for col in range(columnCount):&lt;br /&gt;
 for row in range(rowCount):&lt;br /&gt;
 itemText = str(model.data(model.index(row, col), Qt.DisplayRole).toString())&lt;br /&gt;
 test.verify(itemText != &amp;quot;&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== waitForObjectItem() ==&lt;br /&gt;
&lt;br /&gt;
Using waitForObjectItem() you can access items of a specific widget, such as actions in a menu or, in this case, cells in a table. It takes two parameters, the first being the name of the parent object and the second being the identification for the item. For cells in a table, that is two integers in the form of row/col.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def verifyNoEmptyCells(tableName):&lt;br /&gt;
 table = waitForObject(tableName)&lt;br /&gt;
 columnCount = table.columnCount&lt;br /&gt;
 rowCount = table.rowCount&lt;br /&gt;
&lt;br /&gt;
for col in range(columnCount):&lt;br /&gt;
 for row in range(rowCount):&lt;br /&gt;
 item = waitForObjectItem(tableName, str(row)+&amp;quot;/&amp;quot;&#039;&#039;str(col))&lt;br /&gt;
 test.verify(item.text != &amp;quot;&amp;quot;)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Real name approach ==&lt;br /&gt;
Squish offers two ways of identifying your objects in a test script, either using the symbolic name which maps to an entry in the object map, or using the real name which lists all properties and their expected value in an identification string. Behind the scenes, the symbolic name of course maps to this real name, using the symbolic name generally makes the scripts more readable though.&lt;br /&gt;
&lt;br /&gt;
By using the real name to identify cells, we can change the expected values of the properties and hence access different table cells as seen below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;def verifyNoEmptyCells(tableName):&lt;br /&gt;
 waitFor(&amp;quot;object.exists(tableName)&amp;quot;)&lt;br /&gt;
 columnCount = findObject(tableName).columnCount&lt;br /&gt;
 rowCount = findObject(tableName).rowCount&lt;br /&gt;
&lt;br /&gt;
 for col in range(columnCount):&lt;br /&gt;
 for row in range(rowCount):&lt;br /&gt;
 item = waitForObject(&amp;quot;{column=&#039;&amp;quot;&#039;&#039; str(col) + &amp;quot;&#039; container=&#039;&amp;quot; + tableName + &amp;quot;&#039; row=&#039;&amp;quot; + str(row) + &amp;quot;&#039; type=&#039;QModelIndex&#039;}&amp;quot;)&lt;br /&gt;
 test.verify(item.text != &amp;quot;&amp;quot;)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Custom_Settings_for_Test_Runs/es&amp;diff=32264</id>
		<title>Squish/Custom Settings for Test Runs/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Custom_Settings_for_Test_Runs/es&amp;diff=32264"/>
		<updated>2017-11-25T08:33:20Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: custom settings for test runs/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::Custom_settings_for_test_runs|English]] &#039;&#039;&#039;Español&#039;&#039;&#039; [[:Category:Tools::Squish::CustomSettingsForTestRuns_Italian|Italian]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= Configuración personalizada para pruebas =&lt;br /&gt;
&lt;br /&gt;
En ciertos casos de prueba, podría ser necesario utilizar una configuración personalizada para la aplicación, diferente de otros casos de prueba. Un ejemplo de esto podría ser una aplicación que muestra una guía de introducción la primera vez que se inicia, para configurar algunos parámetros básicos. Esta sólo funciona la primera vez, sin embargo los ajustes son almacenados cuando el caso de prueba ha terminado, preferentemente utilizando QSettings.&lt;br /&gt;
&lt;br /&gt;
Pero ya que podemos acceder a toda la API de Qt desde Squish, hay una manera fácil de evitar este problema! Para el caso de esta prueba específica, simplemente modificamos los QSettings del objeto de la aplicación. O más concretamente, cambiamos la ruta de acceso donde se almacenan los ajustes a un directorio temporal que sera eliminado al final de la secuencia de comandos de la prueba.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tempDir = &amp;quot;/tmp/test-settings&amp;quot;&lt;br /&gt;
QSettings.setPath(QSettings.NativeFormat, QSettings.UserScope, tempDir)&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Custom_Settings_for_Test_Runs&amp;diff=32263</id>
		<title>Squish/Custom Settings for Test Runs</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Custom_Settings_for_Test_Runs&amp;diff=32263"/>
		<updated>2017-11-25T08:30:35Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: custom settings for test runs]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::CustomSettingsForTestRunsSpanish|Español]] [[:Category:Tools::Squish::CustomSettingsForTestRuns_Italian|Italian]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Custom settings for test runs =&lt;br /&gt;
&lt;br /&gt;
In certain test cases, it might be necessary to use custom settings for the application compared to other test cases. This could for example include an application that shows an introductory guide the very first time it is started, to set up some basic settings. This would only work the first time though, as the settings are stored when the test case is finished, preferrably using QSettings.&lt;br /&gt;
&lt;br /&gt;
But since we can access all of the Qt API from Squish, there is an easy way around this problem! For the specific test case, simply modify the QSettings object for the application. Or more specifically, change the path to where the settings are stored to a temporary directory that you are removing at the end of the test script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tempDir = &amp;quot;/tmp/test-settings&amp;quot;&lt;br /&gt;
QSettings.setPath(QSettings.NativeFormat, QSettings.UserScope, tempDir)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep in mind that this call will not modify existing QSettings objects in the application, so this will need to be done before any of those are created.&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Clicking_a_QLabel_Link&amp;diff=32262</id>
		<title>Squish/Clicking a QLabel Link</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Clicking_a_QLabel_Link&amp;diff=32262"/>
		<updated>2017-11-25T08:26:00Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Clicking link in label =&lt;br /&gt;
&lt;br /&gt;
As is commonly known, you can put in hyper text links in a regular QLabel in Qt, by using simple HTML syntax. Then of course, you want to be able to click this link in your Squish tests. However, Squish does not have a clickLink() function, as it does for e.g. clickButton() or clickTab(), so what happens during recording is that you will get code similar to:&lt;br /&gt;
&amp;lt;code&amp;gt;mouseClick(waitForObject(&amp;quot;:MyQLabel&amp;quot;), 31, 14, 0, Qt.LeftButton)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That is, hard coded coordinates for where the link is. So if the position of the link would change for whatever reason (different platform, new text added, different font) the test will break.&lt;br /&gt;
&lt;br /&gt;
In Squish 4.1, a new function named installSignalHandler() was added. This lets your test script react to signals emitted from the application code. We can use this function combined with the fact that a signal is emitted from a QLabel whenever a link is hovered. This will let us implement a function for clicking arbitrary links in a label.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;_lookingFor = None&lt;br /&gt;
_found = False&lt;br /&gt;
&lt;br /&gt;
def handleLinkHovered(obj, link):&lt;br /&gt;
 global _found&lt;br /&gt;
 if link == _lookingFor:&lt;br /&gt;
 _found = True&lt;br /&gt;
&lt;br /&gt;
def findLink(objectName, link):&lt;br /&gt;
 global _lookingFor&lt;br /&gt;
 global _found&lt;br /&gt;
 _lookingFor = link&lt;br /&gt;
 _found = False&lt;br /&gt;
&lt;br /&gt;
object = waitForObject(objectName)&lt;br /&gt;
&lt;br /&gt;
installSignalHandler(object, &amp;quot;linkHovered(QString)&amp;quot;, &amp;quot;handleLinkHovered&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
width = object.width&lt;br /&gt;
 height = object.height&lt;br /&gt;
 y = 0&lt;br /&gt;
 while y &amp;lt; height:&lt;br /&gt;
 x = 0&lt;br /&gt;
 while x &amp;lt; width:&lt;br /&gt;
 sendEvent(&amp;quot;QMouseEvent&amp;quot;, object, QEvent.MouseMove, x, y, Qt.NoButton, 0)&lt;br /&gt;
 if _found:&lt;br /&gt;
 return (x,y)&lt;br /&gt;
 x &#039;&#039;= 5&lt;br /&gt;
 y&#039;&#039;= 10&lt;br /&gt;
&lt;br /&gt;
return (–1,–1)&lt;br /&gt;
&lt;br /&gt;
def clickLink(objectName, link):&lt;br /&gt;
 (x, y) = findLink(objectName, link)&lt;br /&gt;
 if x [[Image:= -1 and y |= -1 and y ]]= 1:&lt;br /&gt;
 mouseClick(objectName, x, y, 0, Qt.LeftButton)&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage is simply:&lt;br /&gt;
&amp;lt;/code&amp;gt;clickLink(&amp;quot;:MyQLabel&amp;quot;, &amp;quot;some-action&amp;quot;)&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Calculating_Checksums&amp;diff=32261</id>
		<title>Squish/Calculating Checksums</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Calculating_Checksums&amp;diff=32261"/>
		<updated>2017-11-25T08:20:20Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= Calculating checksums =&lt;br /&gt;
&lt;br /&gt;
When you are testing e.g. a file transfer client, and you want to make sure the file transferred is the same on both the sender and the receiver side, one easy way of doing this is using checksums. And luckily for us, Python comes with a hashlib module, with support for exactly that! Problem? The Python code in your test script is being executed in the context of the squishrunner, which is a problem if your application (and hence your files) are being executed on another machine, e.g. an embedded system.&lt;br /&gt;
&lt;br /&gt;
But as mentioned in the article on [[:Category:Tools::Squish::Generating test data | generating test data]], Squish gives us access to most of the Qt API using the built-in Qt wrapper library. And whatever Qt code we put into our test script will be executed in the context of the AUT, even when the AUT is being executed on an embedded system. So combining the fact that the Qt code is being executed on the AUT side along with Python&#039;s hashlib module, we can generate checksums!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;import hashlib&lt;br /&gt;
def calculateMd5(fileName):&lt;br /&gt;
 m = hashlib.md5()&lt;br /&gt;
 file = QFile(&amp;quot;s/%s&amp;quot; (currentApplicationContext().cwd, fileName))&lt;br /&gt;
 if file.open(QIODevice.ReadOnly):&lt;br /&gt;
 mb = 1024*1024&lt;br /&gt;
 while not file.atEnd():&lt;br /&gt;
 data = file.read(mb)&lt;br /&gt;
 m.update(str(data))&lt;br /&gt;
 file.close()&lt;br /&gt;
 return m.hexdigest()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;sum = calculateMd5(&amp;quot;test.txt&amp;quot;)&amp;lt;code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Best_Practices/es&amp;diff=32260</id>
		<title>Squish/Best Practices/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Best_Practices/es&amp;diff=32260"/>
		<updated>2017-11-25T08:16:29Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move :Category::Tools::Squish -&amp;gt; :Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: recommended way of working/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::RecommendedWayOfWorking|English]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= La forma recomendada de trabajar con Squish =&lt;br /&gt;
&lt;br /&gt;
Imagine que ha estado utilizando Squish por un tiempo, grabando y reproduciendo casos de prueba con ninguna o sólo pequeñas modificaciones en los scripts de tests. Ha acumulado a una cantidad significativa de casos de prueba y la mayoría de ellos comienzan con la realización de la misma secuencia de pasos, por ejemplo, acceder a un servidor remoto mediante la especificación de un nombre de usuario y una contraseña para luego hacer click en el botón OK en un cuadro de diálogo.&lt;br /&gt;
&lt;br /&gt;
El código luciría mas o menos como lo siguiente:&lt;br /&gt;
&amp;lt;code&amp;gt;def main():&lt;br /&gt;
 type(&amp;quot;:Username_QLineEdit&amp;quot;, &amp;quot;user&amp;quot;)&lt;br /&gt;
 type(&amp;quot;:Password_QLineEdit&amp;quot;, &amp;quot;mypassword&amp;quot;)&lt;br /&gt;
 clickButton(&amp;quot;:OK_QPushButton&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora imagine que por alguna razón, un desarrollador va y cambia su aplicación para no utilizar una caja de textos en el campo de entrada del nombre de usuario, sino que en su lugar utiliza un QComboBox. Ahora tendrá que volver a grabar manualmente o como mínimo cambiar cada caso de prueba que interactue con este cuadro de diálogo de inicio de sesión.&lt;br /&gt;
&lt;br /&gt;
En lugar de crear casos de prueba usando sólo la función de grabación, que con el tiempo daría lugar a problemas como el descrito anteriormente, la manera recomendada de trabajar con Squish es grabar y refactorizar. Es decir, grabar un caso de prueba o una pieza de un caso de prueba y refactorizar en una o varias funciones que luego pueden ser llamadas por el script del test.&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo, se crea un función login(), después de haber registrado el primer caso de prueba que consiste en acceder a un servidor. Entonces, para todos los casos de prueba subsiguientes, solo es necesario llamar a la función login() desde el script del test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def login(username, password):&lt;br /&gt;
 type(&amp;quot;:Username_QLineEdit&amp;quot;, username)&lt;br /&gt;
 type(&amp;quot;:Password_QLineEdit&amp;quot;, password)&lt;br /&gt;
 clickButton(&amp;quot;:OK_QPushButton&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
 login(&amp;quot;user&amp;quot;, &amp;quot;mypassword&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como un efecto secundario de la creación de este método, podemos parametrizar la llamada a la función, para que pueda probar el cuadro de diálogo de inicio de sesión con diferentes valores con sólo llamar con diferentes parámetro a login().&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Best_Practices&amp;diff=32259</id>
		<title>Squish/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Best_Practices&amp;diff=32259"/>
		<updated>2017-11-25T08:13:41Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: Move Category::Tools::Squish -&amp;gt; Category::Squish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: recommended way of working]] if relevant}}&lt;br /&gt;
[[Category:Squish]]&lt;br /&gt;
&lt;br /&gt;
= The recommended way of working with Squish =&lt;br /&gt;
&lt;br /&gt;
Imagine you have been using Squish out-of-the-box for a while, recording and replaying test&lt;br /&gt;
cases with none or only minor manual modifications to the test scripts. You have reached a significant&lt;br /&gt;
amount of test cases, and most of them start with doing the same sequence of steps, e.g. logging in to&lt;br /&gt;
a remote server by specifying a user name and a password and then clicking OK in a dialog.&lt;br /&gt;
&lt;br /&gt;
The code for this could look something like below:&lt;br /&gt;
&amp;lt;code&amp;gt;def main():&lt;br /&gt;
 type(&amp;quot;:Username_QLineEdit&amp;quot;, &amp;quot;user&amp;quot;)&lt;br /&gt;
 type(&amp;quot;:Password_QLineEdit&amp;quot;, &amp;quot;mypassword&amp;quot;)&lt;br /&gt;
 clickButton(&amp;quot;:OK_QPushButton&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now imagine, for some reason, a developer goes and changes your application to not use a line edit as the&lt;br /&gt;
user name input field, but a QComboBox instead. Now you will need to go and manually re-record or at least&lt;br /&gt;
change every single test case interacting with this login dialog.&lt;br /&gt;
&lt;br /&gt;
Instead of creating test cases by simply recording them, as that would eventually lead to the problem above, the&lt;br /&gt;
recommended way of working with Squish is to record and refactor. That is, you record a test case, or a piece&lt;br /&gt;
of a test case, and refactor that into one or several functions that you then call from your test script.&lt;br /&gt;
&lt;br /&gt;
In the example above, you would create a login() function after you have recorded the first test case that&lt;br /&gt;
involves logging in to a server. Then for all subsequent test cases, you call this login() function from&lt;br /&gt;
your test script. In code, this would be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def login(username, password):&lt;br /&gt;
 type(&amp;quot;:Username_QLineEdit&amp;quot;, username)&lt;br /&gt;
 type(&amp;quot;:Password_QLineEdit&amp;quot;, password)&lt;br /&gt;
 clickButton(&amp;quot;:OK_QPushButton&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
 login(&amp;quot;user&amp;quot;, &amp;quot;mypassword&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And as a side-effect of us creating this method, we also parameterized the function call, so you can test&lt;br /&gt;
the login dialog with different values by just adding additional calls to login().&lt;br /&gt;
&lt;br /&gt;
If the same change to the application as above would now be made by a developer, you would not need to change hundreds of test&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Robust_selection_of_listview_or_treeview_items_with_variable_text&amp;diff=32258</id>
		<title>Robust selection of listview or treeview items with variable text</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Robust_selection_of_listview_or_treeview_items_with_variable_text&amp;diff=32258"/>
		<updated>2017-11-25T07:53:43Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: AutoSpider moved page Robust selection of listview or treeview items with variable text to Squish/Robust Selection of View Items with Variable Text: Move under the &amp;quot;Squish&amp;quot; banner; shorten titles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Squish/Robust Selection of View Items with Variable Text]]&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Robust_Selection_of_View_Items_with_Variable_Text&amp;diff=32257</id>
		<title>Squish/Robust Selection of View Items with Variable Text</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Robust_Selection_of_View_Items_with_Variable_Text&amp;diff=32257"/>
		<updated>2017-11-25T07:53:43Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: AutoSpider moved page Robust selection of listview or treeview items with variable text to Squish/Robust Selection of View Items with Variable Text: Move under the &amp;quot;Squish&amp;quot; banner; shorten titles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tools::Squish]]&lt;br /&gt;
&lt;br /&gt;
This article is similiar to to [[Finding list items that ends in a given string]] however goes into a bit more detail and is also functional for treeviews as well as listviews. Dealing with a treeview requires careful handling of &amp;quot;.&amp;quot;-separated paths.&lt;br /&gt;
&lt;br /&gt;
Imagine you need to select some item in a treeview, but you don&#039;t know the exact string of the item as it may have changed. Alternatively maybe the parent item of the item you wish to select has changed, but the item is still the same. You need to find the item you want in the tree, and extract the correct Squish item identifier to interact with it later on.&lt;br /&gt;
&lt;br /&gt;
For example, assume you need to find a certain file in treeview, but the treeview has items with absolute paths that might be different on various machines. All you know is that the filename you are looking for will be the same, if it exists. You wish to iterate through the treeview, checking each level against some known valid path that you have. For this example, we will assume you have paths such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;server1\serverpath\some\path\test_data\test_project\filetest.db&lt;br /&gt;
server32\serverpath\some\path\test_data\test_project\filetest.db&lt;br /&gt;
C:_mirror\some\path\test_data\test_project\filetest.db&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and you can&#039;t be sure which path is in the treeview (potentially as a parent or child item). This means you might need to convert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;server1serverpathsomepathtestdatatestprojectfiletestb.subtem.subSubItem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C:localmirrorsomepathtestdatatestprojectfiletestb.subtem.subSubItem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Note that these paths are escaped so that Squish&#039;s itemview functions properly find the paths). As you can see, all three of the paths are the same from the &amp;quot;test_data&amp;quot; folder onwards, so we will use that to split between the &amp;quot;known good&amp;quot; parts of the path we wish to match, and the variable part we wish to replace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def findRealPath( treeviewname, origpath ):&lt;br /&gt;
 import re&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Original path: &amp;quot;, origpath&lt;br /&gt;
 treeView = waitForObject( treeviewname )&lt;br /&gt;
 model = treeView.model()&lt;br /&gt;
&lt;br /&gt;
# we are looking for this&lt;br /&gt;
 originalParts = origpath.split( &amp;quot;testdata&amp;quot; )&lt;br /&gt;
 pathOnly = originalParts[1]&lt;br /&gt;
 # Remove the items separated by &amp;quot;.&amp;quot; (but not . which is an escaped dot in the folder path)&lt;br /&gt;
 print &amp;quot;Now splitting items: s&amp;quot; re.split( &amp;quot;[&amp;lt;sup&amp;gt;].&amp;quot;, pathOnly, 1 )&lt;br /&gt;
 pieces = re.split( &amp;quot;[&amp;lt;/sup&amp;gt;].&amp;quot;, pathOnly, 1 ) # only split once&lt;br /&gt;
 pathOnly = pieces[ 0 ]&lt;br /&gt;
 childrenItems = &amp;quot;&amp;quot;&lt;br /&gt;
 if len( pieces ) &amp;gt; 1: # If this has children&lt;br /&gt;
 childrenItems = pieces[ 1 ]&lt;br /&gt;
 toplevel = model.rowCount( QModelIndex() )&lt;br /&gt;
 for row in range( toplevel ): # iterate through tree, looking for matching file&lt;br /&gt;
 # shortcut solution: check all top-level items in their first three columns. much more efficient if result is top-level&lt;br /&gt;
 for col in range( 3 ): # check first few columns&lt;br /&gt;
 idx = model.index( row, col, QModelIndex() )&lt;br /&gt;
 if checkModelItemReplacement(idx, pathOnly):&lt;br /&gt;
 return replaceModelIndex(utils.escape(str( idx.data( Qt.DisplayRole ).toString() )), childrenItems)&lt;br /&gt;
&lt;br /&gt;
# didn&#039;t find what we were looking for in the top level, do a search two more levels down&lt;br /&gt;
 # check all our children as well&lt;br /&gt;
 for col in range(20):&lt;br /&gt;
 idx = model.index( row, col, QModelIndex() )&lt;br /&gt;
 childCount = model.rowCount(idx)&lt;br /&gt;
 print &amp;quot;Checking children of item %s, found s&amp;quot; (idx.data(Qt.DisplayRole).toString(), childCount)&lt;br /&gt;
 for childRow in range(childCount):&lt;br /&gt;
 child = model.index( 0, 0, idx )&lt;br /&gt;
 print &amp;quot;checking child %s: s&amp;quot; (childRow, child.data(Qt.DisplayRole).toString())&lt;br /&gt;
 if checkModelItemReplacement(child, pathOnly):&lt;br /&gt;
 # we need to do the replacement differently, because we need to keep the parent in the path&lt;br /&gt;
 partpieces = re.split( &amp;quot;([&amp;lt;sup&amp;gt;]).&amp;quot;, origpath )&lt;br /&gt;
 # find the index that has the test_data/ path. all indexes before that are parents&lt;br /&gt;
 for i in range(len(partpieces)):&lt;br /&gt;
 if &amp;quot;testdata&amp;quot; in partpieces[i]: # stop here&lt;br /&gt;
 # since we split on [&amp;lt;/sup&amp;gt;]. and captured the split text, we need to condense each pair of items&lt;br /&gt;
 num = i/2&lt;br /&gt;
 parentItems = []&lt;br /&gt;
 for k in range(num):&lt;br /&gt;
 parentItems.append( partpieces[k] + partpieces[k+1] ) # rescue the char lost when splitting&lt;br /&gt;
 parentstr = &amp;quot;.&amp;quot;.join(parentItems)&lt;br /&gt;
 return replaceModelIndex(utils.escape(str( child.data( Qt.DisplayRole ).toString() )), childrenItems, parentstr)&lt;br /&gt;
&lt;br /&gt;
# we failed&lt;br /&gt;
 print &amp;quot;Failed to replace: s&amp;quot; origpath&lt;br /&gt;
 return origpath&lt;br /&gt;
&lt;br /&gt;
# used internally by above&lt;br /&gt;
def checkModelItemReplacement( idx, pathOnly ):&lt;br /&gt;
 contents = utils.escape(str( idx.data( Qt.DisplayRole ).toString() ))&lt;br /&gt;
 print &amp;quot;Checking for %s in s&amp;quot; (pathOnly, contents)&lt;br /&gt;
 if pathOnly in contents: # this is the entry we are looking for&lt;br /&gt;
 return True&lt;br /&gt;
 else:&lt;br /&gt;
 return False&lt;br /&gt;
&lt;br /&gt;
# used internally by above&lt;br /&gt;
def replaceModelIndex( contents, children, parents = &amp;quot;&amp;quot; ):&lt;br /&gt;
 print &amp;quot;Replacing with %s and %s with parent? s&amp;quot; (contents, children, parents)&lt;br /&gt;
 replaced = contents&lt;br /&gt;
&lt;br /&gt;
if children [[Image:= &amp;quot;&amp;quot;:&lt;br /&gt;
        replaced += &amp;quot;.&amp;quot; + children&lt;br /&gt;
        print &amp;quot;added children to replaced: %s&amp;quot; % replaced&lt;br /&gt;
    if parents |]]= &amp;quot;&amp;quot;:&lt;br /&gt;
 replaced = parents + &amp;quot;.&amp;quot; + replaced&lt;br /&gt;
 print &amp;quot;added parents to replaced: s&amp;quot; replaced&lt;br /&gt;
 return replaced&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As is visible in the above code sample, this code only searches three-levels-deep for a match. If your tree is deeper than 3 levels, you&#039;ll need to either add another level of drilling down, or convert it into recursive function that works on any arbitrary level. The above code can be used like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;treeViewName = &amp;quot;:Your_treeview_here&amp;quot;&lt;br /&gt;
itemPath = &amp;quot;server1serverpathsomepathtestdatatestprojectfiletestb.subtem.subSubItem&amp;quot;&lt;br /&gt;
realItemPath = findRealPath( treeViewName, itemPath )&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Hooking_into_slow-launching_subprocesses_on_Windows&amp;diff=32256</id>
		<title>Hooking into slow-launching subprocesses on Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Hooking_into_slow-launching_subprocesses_on_Windows&amp;diff=32256"/>
		<updated>2017-11-25T07:53:42Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: AutoSpider moved page Hooking into slow-launching subprocesses on Windows to Squish/Hooking into Subprocesses: Move under the &amp;quot;Squish&amp;quot; banner; shorten titles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Squish/Hooking into Subprocesses]]&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Hooking_into_Subprocesses&amp;diff=32255</id>
		<title>Squish/Hooking into Subprocesses</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Hooking_into_Subprocesses&amp;diff=32255"/>
		<updated>2017-11-25T07:53:42Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: AutoSpider moved page Hooking into slow-launching subprocesses on Windows to Squish/Hooking into Subprocesses: Move under the &amp;quot;Squish&amp;quot; banner; shorten titles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tools::Squish]]&lt;br /&gt;
&lt;br /&gt;
Sometimes when writing Squish tests the application being tested launches a subprocess. In this short tip we&#039;ll see how to robustly connect to an externally launched subprocess on Windows.&lt;br /&gt;
&lt;br /&gt;
As the froglogic Squish manual (section 17.7.1) explains, hooking into an AUT&#039;s subprocess when on windows is slightly more complex, as Squish is not able to use LD_PRELOAD (or DYLD_INSERT_LIBRARIES on OS X) to insert the squish library hook into the launching executable. Two options to get around this are clear—the AUT sourcecode can be modified to optionally insert &amp;quot;dllpreload.exe&amp;quot; into the subprocess launch (as the squish manual explains), or the AUT can be modified to call an external shell script that does the optional prepending of &#039;dllpreload.exe&#039;.&lt;br /&gt;
&lt;br /&gt;
In any case, once the AUT has been modified to properly launch the subprocess, the squish test still needs to attach to the launching subprocess. If the AUT uses QProcess to launch the subprocess, it is enough to do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; subprocess = waitForApplicationLaunch()&amp;lt;/code&amp;gt;&lt;br /&gt;
However, if the squish IDE is set up to attach to the AUT manually, the desired call would be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; subprocess = attachToApplication( &amp;quot;APPNAME&amp;quot; )&amp;lt;/code&amp;gt;&lt;br /&gt;
However, the attachToApplication() call will throw an exception if the subprocess is not ready. So, a more robust way to give the subprocess time to launch properly is to try again in a loop for a predetermined amount of time:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; subprocess = 0&lt;br /&gt;
 count = 0&lt;br /&gt;
 while True:&lt;br /&gt;
 if count &amp;gt; 30:&lt;br /&gt;
 raise RuntimeError( &amp;quot;Attaching to AUT subprocess failed!&amp;quot; )&lt;br /&gt;
 try:&lt;br /&gt;
 subprocess = attachToApplication(&amp;quot;APPNAME&amp;quot;)&lt;br /&gt;
 break&lt;br /&gt;
 except:&lt;br /&gt;
 snooze(1)&lt;br /&gt;
 count += 1&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Category:Tools::SquishSpanish::RecommendedWayOfWorkingSpanish&amp;diff=32254</id>
		<title>Category:Tools::SquishSpanish::RecommendedWayOfWorkingSpanish</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Category:Tools::SquishSpanish::RecommendedWayOfWorkingSpanish&amp;diff=32254"/>
		<updated>2017-11-25T02:56:47Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: AutoSpider moved page Category:Tools::SquishSpanish::RecommendedWayOfWorkingSpanish to Squish/Best Practices/es: Title name format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Squish/Best Practices/es]]&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
	<entry>
		<id>https://wiki.qt.io/index.php?title=Squish/Best_Practices/es&amp;diff=32253</id>
		<title>Squish/Best Practices/es</title>
		<link rel="alternate" type="text/html" href="https://wiki.qt.io/index.php?title=Squish/Best_Practices/es&amp;diff=32253"/>
		<updated>2017-11-25T02:56:47Z</updated>

		<summary type="html">&lt;p&gt;AutoSpider: AutoSpider moved page Category:Tools::SquishSpanish::RecommendedWayOfWorkingSpanish to Squish/Best Practices/es: Title name format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Delete|reason=Page not category. Include as single block in [[Squish: recommended way of working/es]] if relevant}}&lt;br /&gt;
This page in: [[:Category:Tools::Squish::RecommendedWayOfWorking|English]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tools::Squish]]&lt;br /&gt;
[[Category:Spanish]]&lt;br /&gt;
&lt;br /&gt;
= La forma recomendada de trabajar con Squish =&lt;br /&gt;
&lt;br /&gt;
Imagine que ha estado utilizando Squish por un tiempo, grabando y reproduciendo casos de prueba con ninguna o sólo pequeñas modificaciones en los scripts de tests. Ha acumulado a una cantidad significativa de casos de prueba y la mayoría de ellos comienzan con la realización de la misma secuencia de pasos, por ejemplo, acceder a un servidor remoto mediante la especificación de un nombre de usuario y una contraseña para luego hacer click en el botón OK en un cuadro de diálogo.&lt;br /&gt;
&lt;br /&gt;
El código luciría mas o menos como lo siguiente:&lt;br /&gt;
&amp;lt;code&amp;gt;def main():&lt;br /&gt;
 type(&amp;quot;:Username_QLineEdit&amp;quot;, &amp;quot;user&amp;quot;)&lt;br /&gt;
 type(&amp;quot;:Password_QLineEdit&amp;quot;, &amp;quot;mypassword&amp;quot;)&lt;br /&gt;
 clickButton(&amp;quot;:OK_QPushButton&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora imagine que por alguna razón, un desarrollador va y cambia su aplicación para no utilizar una caja de textos en el campo de entrada del nombre de usuario, sino que en su lugar utiliza un QComboBox. Ahora tendrá que volver a grabar manualmente o como mínimo cambiar cada caso de prueba que interactue con este cuadro de diálogo de inicio de sesión.&lt;br /&gt;
&lt;br /&gt;
En lugar de crear casos de prueba usando sólo la función de grabación, que con el tiempo daría lugar a problemas como el descrito anteriormente, la manera recomendada de trabajar con Squish es grabar y refactorizar. Es decir, grabar un caso de prueba o una pieza de un caso de prueba y refactorizar en una o varias funciones que luego pueden ser llamadas por el script del test.&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo, se crea un función login(), después de haber registrado el primer caso de prueba que consiste en acceder a un servidor. Entonces, para todos los casos de prueba subsiguientes, solo es necesario llamar a la función login() desde el script del test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;def login(username, password):&lt;br /&gt;
 type(&amp;quot;:Username_QLineEdit&amp;quot;, username)&lt;br /&gt;
 type(&amp;quot;:Password_QLineEdit&amp;quot;, password)&lt;br /&gt;
 clickButton(&amp;quot;:OK_QPushButton&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
 login(&amp;quot;user&amp;quot;, &amp;quot;mypassword&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como un efecto secundario de la creación de este método, podemos parametrizar la llamada a la función, para que pueda probar el cuadro de diálogo de inicio de sesión con diferentes valores con sólo llamar con diferentes parámetro a login().&lt;/div&gt;</summary>
		<author><name>AutoSpider</name></author>
	</entry>
</feed>