Re: [PySide] Active development for QtAsyncio

2024-07-23 Thread Adrian Herrmann via PySide
Hello Loan,

I have indeed been the creator and maintainer of QtAsyncio, so you were right 
to contact me. Unfortunately, I also have to share that I am leaving Qt Group, 
and I will therefore no longer work on QtAsyncio. Tomorrow will be my last day 
at the company.

QtAsyncio will be in good hands with my colleagues, I have CC'ed my team's 
mailing list so you can contact them. And seeing your interest and your 
eagerness to help, I'm sure the project will be in good hands through you as 
well. :)

It would indeed be of great help if you could share a minimal code example to 
reproduce your problem, and I would like to encourage you to also open a bug 
report: https://bugreports.qt.io/projects/PYSIDE/issues (select QtAsyncio as 
the component).

You will find some documentation for QtAsyncio in our docs: 
https://doc.qt.io/qtforpython-6/PySide6/QtAsyncio/index.html
I would also like to encourage you to check out this presentation I did about 
QtAsyncio at a conference: https://www.youtube.com/watch?v=XuqdTvisqkQ

In a nutshell, these are the main concepts:

- QAsyncioEventLoop implements asyncio's event loop API and wraps around Qt's 
event loop. E.g., asyncio's methods to start or stop the event loop map to 
corresponding methods from Qt. If you want to implement more methods from the 
asyncio API, such as its networking API, you have to do it in here.
- QAsyncioHandle is where callbacks are enqueued in Qt's event loop. We do this 
with the QTimer.singleShot() method. It is unlikely you will have to touch this.
- QAsyncioTask and QAsyncioFuture are pure Python code and implement the future 
and task classes without requiring any Qt code. It is also unlikely you will 
have to touch these, although you will encounter QAsyncioTask's _step method 
often while debugging - this is where coroutines are executed.

There are a few unmerged patches that lay the groundwork for implementing 
additional parts of asyncio's API. The networking part of the API is one that I 
grappled with in particular. One challenge that I encountered was converting 
between Python data types and Qt data types. I elaborate a bit on this 
challenge inside one of these patches. You may refer to the documentation, 
comments, code etc.:

https://codereview.qt-project.org/c/pyside/pyside-setup/+/492166
https://codereview.qt-project.org/c/pyside/pyside-setup/+/545892
https://codereview.qt-project.org/c/pyside/pyside-setup/+/498796
https://codereview.qt-project.org/c/pyside/pyside-setup/+/497120
https://codereview.qt-project.org/c/pyside/pyside-setup/+/545224
https://codereview.qt-project.org/c/pyside/pyside-setup/+/493006

Feel free to CC my private email address for future enquiries regarding 
QtAsyncio if you send them to the PySide mailing list: adrian@outlook.com

Best regards and thank you for your enthusiasm,

Adrian Herrmann
Specialist Software Engineer, Qt for Python

Qt Group
Erich-Thilo-Str. 10 12489
Berlin, Germany
adrian.herrm...@qt.io
+49 1578 0598682
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B


Von: guilbaudl 
Gesendet: Montag, 22. Juli 2024 00:36
An: Adrian Herrmann
Betreff: Active development for QtAsyncio

Hello Adrian,

I saw that you are actively working on the QtAsyncio library for Python. I 
myself try to fix what is missing in the lib in order to make it work for a 
small use case I have, where it uses aiohttp.

I was wondering if you wanted to have a small piece of code to reproduce the 
problem I am facing. Also, despite my poor understanding of how QtAsyncio works 
on top of asyncio, I am willing to help in any way I can.

So far, I mostly copied and adapted parts from asyncio to QtAsyncio to get 
farther in the resolution of the issue with using aiohttp. But do you have some 
documentation to understand better the functioning of QtAsyncio and why it has 
been implemented as it is so far?

Best regards,

Loan Guilbaud
___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside


Re: [PySide] Advice for QTcpSocket

2024-01-12 Thread Adrian Herrmann via PySide
Hello Henry,

It sounds to me like you have two separate threads with separate event loops, 
one client thread that sends positions and one GUI thread?

Without having verified this, I would suspect that the operating system would 
prevent a simultaneous read and write to an I/O device. In this case, I think 
the OS would return an error on the write attempt and propagate it to Qt and to 
your application. However, I could be mistaken here, as both accessing threads 
belong to the same process and therefore share resources. If you find that this 
is indeed the case and Qt does not provide its own conflict arbitration, you 
could help yourself with a lock to the socket.

This said, your question is not about PySide specifically, so I would advise to 
resend it to the qt-interest mailing list, the mailing list for developers who 
use Qt: https://lists.qt-project.org/listinfo/interest

Best regards,

Adrian Herrmann
Software Engineer, Qt for Python

Qt Group
Erich-Thilo-Str. 10 12489
Berlin, Germany
adrian.herrm...@qt.io
+49 1578 0598682
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B




Von: PySide  im Auftrag von henry.wede--- via 
PySide 
Gesendet: Montag, 8. Januar 2024 19:48
An: pyside@qt-project.org
Betreff: [PySide] Advice for QTcpSocket

Hello,

So far, my life with sockets has been very easy.  Now I have something more 
complicated and hope that somebody can provide some guidance.

There are thousands of positions that need to be sent to a robot controller via 
TCP.  The controller can buffer eight positions, so the program has to keep the 
buffer full.  The program can send the positions without a reply and the reply 
will only show up when the robot has moved to that position.  I need to add 
that each position has a unique sequential number.  This means that the "send" 
and "receive" transactions are not coupled together.  I hope that makes sense.

My plan is to start a thread to act as a client.  Then send positions in 
messages.  When the thread gets a readyRead signal it would read all of the 
data (a reply to one of the positions) and then send a signal back to the GUI.  
I will have to come up with some logic to make sure there is always eight 
positions sent to the robot and manage errors.

My question:
The thread would have some sort of self._socket object and a onReadReady method 
to read the data.  What happens if the GUI tries to send a message using 
MyThread_socket.send(MyMessage) while some data is being read?  Does the socket 
nicely wait until the data is read and then send the message or is there some 
sort of collision that breaks everything?  It is pretty likely that the GUI 
will want to send a position while the socket is reading a message

Trying to understand how to handle this "separated" send and receive concept.

Thanks for your suggestions - I hope my explanation was good enough.

Henry


___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside


Re: [PySide] Advice for QTcpSocket

2024-01-12 Thread Adrian Herrmann via PySide
Hello Henry,

It sounds to me like you have two separate threads with separate event loops, 
one client thread that sends positions and one GUI thread?

Without having verified this, I would suspect that the operating system would 
prevent a simultaneous read and write to an I/O device. In this case, I think 
the OS would return an error on the write attempt and propagate it to Qt and to 
your application. However, I could be mistaken here, as both accessing threads 
belong to the same process and therefore share resources. If you find that this 
is indeed the case and Qt does not provide its own conflict arbitration, you 
could help yourself with a lock to the socket.

This said, your question is not about PySide specifically, so I would advise to 
resend it to the qt-interest mailing list, the mailing list for developers who 
use Qt: https://lists.qt-project.org/listinfo/interest

Best regards,
Adrian


Von: PySide  im Auftrag von henry.wede--- via 
PySide 
Gesendet: Montag, 8. Januar 2024 19:48
An: pyside@qt-project.org
Betreff: [PySide] Advice for QTcpSocket

Hello,

So far, my life with sockets has been very easy.  Now I have something more 
complicated and hope that somebody can provide some guidance.

There are thousands of positions that need to be sent to a robot controller via 
TCP.  The controller can buffer eight positions, so the program has to keep the 
buffer full.  The program can send the positions without a reply and the reply 
will only show up when the robot has moved to that position.  I need to add 
that each position has a unique sequential number.  This means that the "send" 
and "receive" transactions are not coupled together.  I hope that makes sense.

My plan is to start a thread to act as a client.  Then send positions in 
messages.  When the thread gets a readyRead signal it would read all of the 
data (a reply to one of the positions) and then send a signal back to the GUI.  
I will have to come up with some logic to make sure there is always eight 
positions sent to the robot and manage errors.

My question:
The thread would have some sort of self._socket object and a onReadReady method 
to read the data.  What happens if the GUI tries to send a message using 
MyThread_socket.send(MyMessage) while some data is being read?  Does the socket 
nicely wait until the data is read and then send the message or is there some 
sort of collision that breaks everything?  It is pretty likely that the GUI 
will want to send a position while the socket is reading a message

Trying to understand how to handle this "separated" send and receive concept.

Thanks for your suggestions - I hope my explanation was good enough.

Henry


___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside


Re: [PySide] Heads up: Deprecating asyncio.set_event_loop_policy

2023-11-16 Thread Adrian Herrmann via PySide
Hello Petr,

Thank you very much for calling this to our attention. If I understand it 
right, it seems that the replacement will be to use a new optional loop_factory 
argument that has been introduced for asyncio.run() in Python 3.12): 
https://docs.python.org/3.12/library/asyncio-runner.html#asyncio.run

Unfortunately, our examples use asyncio.get_event_loop().run_forever() instead 
of asyncio.run(coro), as the latter approach does not work when we want to keep 
the event loop running even after the given coroutine finished, which would be 
the case for a graphical program that waits for user input. I have raised this 
point in the Python discussion thread.

Since we will keep supporting Python versions before 3.12 for a few more PySide 
versions and also maintain backwards compatibility during this time, the event 
loop policy will remain for now as we explore the new recommended way of 
handling this scenario in cooperation with the Python maintainers.

I look forward to the continued discussion of this with you and the other 
maintainers.

Best regards,

Adrian Herrmann
Software Engineer, Qt for Python

Qt Group
Erich-Thilo-Str. 10 12489
Berlin, Germany
adrian.herrm...@qt.io
+49 1578 0598682
http://www.qt.io/

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B




Von: PySide  im Auftrag von Petr Viktorin 

Gesendet: Montag, 13. November 2023 10:32
An: pyside@qt-project.org
Betreff: [PySide] Heads up: Deprecating asyncio.set_event_loop_policy

Hello,
The maintainers of `asyncio` are considering deprecation of
`asyncio.set_event_loop_policy()`, as it's not needed for IO use cases.
This would affect Qt for Python, including [examples/async code] which
people presumably reuse in their own projects.

It's not entirely clear what the recommended replacement should be.
`asyncio` developers could use some help understanding GUI integration
use cases.
Here's a [relevant comment]:

 > You could overwrite asyncio.EventLoop but the scary thing there is
that it affects all threads. What if I wanted a background thread to
continut to just run the original default EventLoop?
 >
 > Are those frameworks auto-installing their own policy as a side
effect of being imported? Does the policy they install create an event
loop of their type for all threads? If so, overwriting EventLoop is not
much of a regression. If they are careful to only do something special
for the main thread (or for the first event loop created or whatever) we
may have to provide a mechanism to set a loop factory per thread, for
example. At that point might we not just keep the existing policy system
for that purpose, rather than retiring that and inventing something new
to replace it?

You're welcome to join the discussion at
https://github.com/python/cpython/issues/94597 or
https://discuss.python.org/t/37553


[examples/async code]:
https://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples/async/eratosthenes/eratosthenes_asyncio.py#n137
[relevant comment]: https://discuss.python.org/t/37553/25
___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside
___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside


Re: [PySide] Help importing compiled Qt resource file from subfolder

2023-09-28 Thread Adrian Herrmann via PySide
Hello Henry,

for your current project structure it appears that this line in helpers.py 
would be enough for the import to work:

  from images.compiledresource_rc import someFunction

This should work regardless of the working directory, as long as helpers.py is 
imported from main.py, because the directory that main.py sits in is always 
added to PYTHONPATH.

Let us know if you have further questions or problems.
Best regards,

Adrian Herrmann

Software Engineer, Qt for Python

Qt Group
Erich-Thilo-Str. 10 12489
Berlin, Germany

adrian.herrm...@qt.io

+49 1578 0598682

www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B

[https://s3.eu-north-1.amazonaws.com/email-signature-tool-leroy/Qt-Group-logo-black.png]
[https://s3.eu-north-1.amazonaws.com/email-signature-tool-leroy/facebook-x2-right_2023-03-01-095511_zhlr.png]
 
[https://s3.eu-north-1.amazonaws.com/email-signature-tool-leroy/twitter-x2.png] 
 
[https://s3.eu-north-1.amazonaws.com/email-signature-tool-leroy/linkedin-x2.png]
 
[https://s3.eu-north-1.amazonaws.com/email-signature-tool-leroy/youtube-x2.png] 



Von: PySide  im Auftrag von henry.wede--- via 
PySide 
Gesendet: Montag, 25. September 2023 01:00
An: pyside@qt-project.org
Betreff: [PySide] Help importing compiled Qt resource file from subfolder

Hello,

I have spend the last few hours trying to figure this out and now I have to ask 
for some help.

My project has grown to the point where is needs to be more organized, so I am 
moving modules from one huge folder into subfolders.  I use a resource file in 
QtDesigner and then compile it resulting in a "something_rc.py".  With the "one 
huge folder" approach I just imported this file into any module that uses 
dialogs - this is the only way that the images would show up in the widgets.  
Now I am struggling to do this with the folder structure.

I made a simple example that shows the issue.  The tree is below and the 
attached zip file contains everything.

pkg
│   main.py
│   test_local.py
│
├───images
│   compiledresource_rc.py
│
└───utils
helpers.py
util.py
__init__.py


Briefly, main can import test_local and util without any problems.  The issue 
is that if helpers needs to import the compiled resource file 
compiledresource_rc.  I swear that I have tried the exact syntax from different 
Internet resources and I cannot get it to work.

Can somebody please help me deal with this resource file?

Thank you for your help,
Henry




___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside


Re: [PySide] Deadlocks during signal.disconnect

2023-06-21 Thread Adrian Herrmann via PySide
Hi Christoph,

Thank you very much for reporting this bug to us. It would be of tremendous 
help if you could provide a minimal reproduceable example so we can try to 
reproduce the issue ourselves and debug. Also, please do not hesitate to open a 
bug report, that makes it easier for us to keep track of all related 
information and progress. :)

Best regards,

Adrian Herrmann
Software Engineer, Qt for Python

Qt Group
Erich-Thilo-Str. 10 12489
Berlin, Germany
adrian.herrm...@qt.io
+49 1578 0598682
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B



Von: PySide  im Auftrag von ic...@gmx.net 

Gesendet: Samstag, 17. Juni 2023 19:27
An: PySide@qt-project.org
Betreff: [PySide] Deadlocks during signal.disconnect

Hi,

I thought before opening a bug I'd ask this question here and see if I'm doing 
something stupid... The problem occurs very rarely (maybe in one of 100 tries), 
but it is reproducable in a larger application. Please forgive to not have a 
stripped down test, maybe someone can already see what is happening from the 
information given. If not, I'd probably have to reproduce the issue in a 
smaller test case.

It seems that the signal.disconnect deadlocks sometimes.

There are two classes involved:

class MyFilter(ClassDerivingFromQObject):
# snip
def onOpen(self):
logger.info("onOpen start")
pb = Services.getService("PlaybackControl")
pb.sequenceOpened.connect(self.seqOpened)
logger.info("onOpen stop")

def onClose(self):
logger.info("onClose start")
pb = Services.getService("PlaybackControl") # pb is a QSharedPointer to 
a python class deriving from QObject (the project uses shiboken)
s = pb.sequenceOpened
s.disconnect(self.seqOpened) # this call deadlocks
logger.info("onClose stop")

def seqOpened(self, *args):
logger.info("seqOpened")


And the other involved class

class GenericReader(AnotherClassDerivingFromQObject):
# snip
   def onClose(self):
   pb = Services.getService("PlaybackControl") # pb is a QSharedPointer to 
a python class deriving from QObject (the project uses shiboken)
   pb.removeConnections(self) # this call deadlocks


I managed to get the python tracebacks using the very cool project py-spy:

Thread 197717 (idle): "Dummy-1"
   onClose (myfilter.py:23)
   _stateTransition (nexxT/core/FilterEnvironment.py:310)
   close (nexxT/core/FilterEnvironment.py:366)
   performOperation (nexxT/core/Thread.py:197)
   run (nexxT/core/Thread.py:52)
Thread 197716 (idle)
   onClose (nexxT/filters/GenericReader.py:361)
   _stateTransition (nexxT/core/FilterEnvironment.py:310)
   close (nexxT/core/FilterEnvironment.py:366)
   performOperation (nexxT/core/Thread.py:197)
   run (nexxT/core/Thread.py:52)

And the tracebacks from gdb of these threads are here:

Thread 10 (Thread 0x7f5aa4a8a6c0 (LWP 197717) "filter"):
#0  0x7f5ac1dcf4f9 in syscall () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x7f5aab4cae95 in QBasicMutex::lockInternal() () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/Qt/lib/libQt6Core.so.6
#2  0x7f5aab38f2d5 in ?? () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/Qt/lib/libQt6Core.so.6
#3  0x7f5aab390307 in QMetaObject::disconnectOne(QObject const*, int, 
QObject const*, int) () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/Qt/lib/libQt6Core.so.6
#4  0x7f5aac6af048 in PySide::qobjectDisconnectCallback(QObject*, char 
const*, _object*) () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/libpyside6.abi3.so.6.4
#5  0x7f5aabbd985b in ?? () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/QtCore.abi3.so
#6  0x00547ac6 in ?? ()
#7  0x005f7f50 in PyObject_CallObject ()
#8  0x7f5aac6a489d in ?? () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/libpyside6.abi3.so.6.4
#9  0x005230d0 in ?? ()
#10 0x0053ac2c in PyObject_Vectorcall ()
#11 0x0052b940 in _PyEval_EvalFrameDefault ()
#12 0x005855a4 in ?? ()
#13 0x0058510e in ?? ()
#14 0x7f5aac69d2f1 in 
PySide::SignalManager::callPythonMetaMethod(QMetaMethod const&, void**, 
_object*, bool) () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/libpyside6.abi3.so.6.4
#15 0x7f5aac69d5d6 in 
PySide::SignalManager::SignalManagerPrivate::qtMethodMetacall(QObject*, int, 
void**) () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/libpyside6.abi3.so.6.4
#16 0x7f5aab38937c in QObject::event(QEvent*) () from 
/home/wiedeman/develop/nexxT-deadlock/venv/lib/python3.11/site-packages/PySide6/Qt/lib/libQt6Core.so.6
#

Re: [PySide] How to get more details about what caused a program crash

2022-11-08 Thread Adrian Herrmann via PySide
Hello Henry,

Generally speaking, I would recommend using an IDE like Qt Creator or Visual 
Studio Code. They are easy to set up for Python coding and would make it easier 
to identify and debug problems in your (or our!) code.

For your problem in particular, could you elaborate on this part: "There is no 
error message, it just closes."
Does the graphical window close? Is there any text output on the console 
window? Could you check the exit code of Python when your program crashed? 
Since it sounds like you're using Command Prompt, you would do that by running 
"echo %errorlevel%" directly after Python exited. (I would also recommend using 
PowerShell instead of Command Prompt, but one step at a time. 🙂)

You're also welcome to send us a minimal code sample that reproduces the error 
you describe so we can give it a try on our end.

Finally, I'm also curious if there is a reason in particular you're using 
PySide2 instead of PySide6?

Best regards :),

Adrian Herrmann
Software Engineer, Qt for Python
The Qt Company
Erich-Thilo-Str. 10 12489
Berlin, Germany
adrian.herrm...@qt.io
+49 1578 0598682
www.qt.io
Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B


Von: PySide  im Auftrag von henry.wede--- via 
PySide 
Gesendet: Sonntag, 6. November 2022 23:26
An: pyside@qt-project.org
Betreff: [PySide] How to get more details about what caused a program crash

Hello,

I am creating a program using PySide2 and Python V3.9.0 under Windows 10.  
There is no fancy IDE involved... just QtDesigner to create the UI files, 
Notepad++ to do the editing, and a DOS Window to run the program.

When running the program, the user can add items to a QTreeWidget.  There are 5 
main "branches" and a dialog box lets the user choose which branch to add an 
item to.  I can add one item to each branch without any problems - but when I 
add a second item to any branch the program crashes.  There is no error 
message, it just closes.  It took awhile to figure out what the problem was.

I tried a couple different ways to add the item, so I don't suspect that is the 
problem.
The method for adding an items looks like this:

def AddAsset(self, NewAsset, BranchName):
'''Add the new asset as a child to the existing branch.
'''

Item = self.Widget.findItems(BranchName, QtCore.Qt.MatchExactly, column=0)[0]
print(Item)
print(Item.childCount())
Item.addChild(NewAsset)
print(Item.childCount())

The print statements always make sense... it has 0 children then 1 child.  Next 
time it has 1 child then 2 children then crashes.

Is there a way to get more detailed information about the problem?

Any suggestions of what my next step should be?

Thanks in advance,
Henry

___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside


Re: [PySide] New Qt for Python release: 6.4.0 is out!

2022-10-17 Thread Adrian Herrmann via PySide



Hi David, thank you for bringing this to our attention, I can confirm your 
report. We will look into it asap.
Best,


Adrian Herrmann
Software Engineer, Qt for Python

The Qt Company
Erich-Thilo-Str. 10 12489
Berlin, Germany
adrian.herrm...@qt.io
+49 1578 0598682
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der 
Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B


-Ursprüngliche Nachricht-
Von: PySide  Im Auftrag von David Ching
Gesendet: Montag, 17. Oktober 2022 18:00
An: pyside@qt-project.org
Betreff: Re: [PySide] New Qt for Python release: 6.4.0 is out!

> Date: Mon, 17 Oct 2022 09:20:28 +0200
> From: Cristi?n Maureira-Fredes   
> Hello,
>
> Can you try to install PySide6 on a fresh virtual environment and 
> verify
this?
>
> If you are unfamiliar with that:
> https://doc.qt.io/qtforpython/quickstart.html
>
> It might be that you are installing everything on your system Python, 
> and
then there might be some issues with upgrades.

Thanks Cristian, I tried in both a clean virtual environment as well as a 
cleaned up system environment.  
pyside6-qtpy2cpp.exe is still missing after PIP install on Windows.
I'm excited to try this; hope I can get it soon!

Thanks,
David



___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside
___
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside