We’ve created client libraries for a few important languages with as few dependencies as possible: pywebchannel (Python, no dependencies), webchannel.net (.NET/C#, depends on JSON.NET) and webchannel++ (header-only C++14, depends on Niels Lohmann’s JSON library).
Python and .NET are a pretty good match: Their dynamic language features make it possible to use remote methods and properties like they were native. Due to being completely statically typed, C++ makes the interface a little more clunky, although variadic templates help a lot to make it easier to use.
As with the original Qt WebChannel C++ classes, transports are completely user defined. When sensible, a default implementation of a transport is provided.
Long story short, here’s an example of how to use the Python client. It’s designed to talk with the
chatserver example of the Qt WebChannel module over a WebSocket. It even supports the
asyncio features of Python 3! Relevant excerpt without some of the boilerplate:
async def run(webchannel):
# Wait for initialized
chatserver = webchannel.objects["chatserver"]
username = None
async def login():
username = input("Enter your name: ")
return await chatserver.login(username)
# Loop until we get a valid username
while not await login():
print("Username already taken. Please enter a new one.")
# Keep the username alive
chatserver.keepAlive.connect(lambda *args: chatserver.keepAliveResponse(username))
# Connect to chat signals
chatserver.userListChanged.connect(lambda *args: print_newusers(chatserver))
# Read and send input
msg = await ainput()
loop = asyncio.get_event_loop()
proto = loop.run_until_complete(websockets.client.connect(CHATSERVER_URL, create_protocol=QWebChannelWebSocketProtocol))
pywebchannel can also be used without the
async/await syntax and should also be compatible with Python 2.
I would also really like to push the code upstream, but I don’t know when I’ll have the time to spare. Then there’s also the question of how to build and deploy the libraries. Would the qtwebchannel module install to $PYTHONPREFIX? Would it depend on a C# compiler (for which support would have to be added to qmake)?
In any case, I think the client libraries can come in handy and expand the spectrum of application of Qt WebChannel.