QXmpp
Introduction
QXmpp is a cross-platform C++ XMPP client and server library built on top of the Qt framework (Qt 6.4+). It implements a large number of XMPP Extension Protocols (XEPs) and exposes a modern, reactive API based on C++20 and Qt's property system.
Getting Started
The central class is QXmppClient. Create one, register the managers you need, then connect:
auto *client = new QXmppClient(this); // Register managers auto *pubsub = client->addNewExtension<QXmppPubSubManager>(); auto *disco = client->addNewExtension<QXmppDiscoveryManager>(); auto *muc = client->addNewExtension<QXmppMucManagerV2>(); // Connect QXmppConfiguration config; config.setJid("user@example.org"); config.setPassword("secret"); client->connectToServer(config);
Async API
All network operations return a QXmppTask<T>, which represents a pending result. QXmppTask supports co_await, making sequential async code straightforward:
QXmppTask<void> MyManager::doSomething() { auto result = co_await muc->joinRoom("room@conference.example.org", "MyNick").withContext(this); if (auto *err = std::get_if<QXmppError>(&result)) { qWarning() << "Join failed:" << err->description; co_return; } // continue ... }
Alternatively, use .then() to attach a callback:
muc->joinRoom("room@conference.example.org", "MyNick").then(this, [](auto result) { if (auto *err = std::get_if<QXmppError>(&result)) { qWarning() << "Join failed:" << err->description; } });
Results are typically QXmpp::Result<T>, a std::variant<T, QXmppError>. Always pass a context object (this) to .then() or .withContext() to ensure the callback is not invoked after the object has been destroyed.
Reactive Properties
Selected APIs expose observable state via QBindable<T>, backed by Qt's QProperty system. QXmppMucRoomV2 is the primary example — room info, config, and participant state are all exposed as bindable properties that update automatically when the server reports changes:
auto room = muc->room("room@conference.example.org"); room.setWatchAvatar(true); auto avatar = room.avatar(); avatar.addNotifier([avatar]() { // called whenever the room avatar changes auto val = avatar.value(); });
Managers
Managers are the primary way to use XMPP features. Register them with QXmppClient and extend QXmppClient by subclassing QXmppClientExtension. See the Managers module for the full list.
Messaging
- QXmppCarbonManagerV2 — Message carbons (XEP-0280)
- QXmppMamManager — Message archive management (XEP-0313)
- QXmppMessageReceiptManager — Message delivery receipts (XEP-0184)
- QXmppAttentionManager — Attention requests (XEP-0224)
Contacts and Roster
- QXmppRosterManager — Contact list (XEP-0162)
- QXmppVCardManager — vCards (vcard-temp)
- QXmppUserLocationManager — User location (XEP-0080)
- QXmppUserTuneManager — User tune (XEP-0118)
- QXmppVersionManager — Software version (XEP-0092)
- QXmppEntityTimeManager — Entity time (XEP-0202)
Groupchat
- QXmppMucManagerV2 — Multi-user chat with reactive API (XEP-0045)
- QXmppMixManager — Mediated Information eXchange (XEP-0369)
File Sharing
- QXmppFileSharingManager — Stateless file sharing (XEP-0447)
- QXmppHttpUploadManager — HTTP file upload service (XEP-0363)
- QXmppUploadRequestManager — HTTP upload slot requests (XEP-0363)
- QXmppTransferManager — In-band / SOCKS5 file transfer (XEP-0047, XEP-0065)
End-to-End Encryption
- QXmppOmemoManager — OMEMO 2 end-to-end encryption (XEP-0384)
- QXmppAtmManager — Automatic trust management (XEP-0450)
- QXmppTrustManager — Trust level storage and queries
Calls
- QXmppCallManager — Jingle audio/video calls (XEP-0166)
- QXmppCallInviteManager — Call invites (XEP-0482)
- QXmppJingleMessageInitiationManager — Jingle message initiation (XEP-0353)
Bookmarks and PubSub
- QXmppPepBookmarkManager — PEP native bookmarks (XEP-0402)
- QXmppPubSubManager — Publish-subscribe (XEP-0060)
Service Discovery and Utilities
- QXmppDiscoveryManager — Service discovery (XEP-0030)
- QXmppBlockingManager — Contact blocking (XEP-0191)
- QXmppExternalServiceDiscoveryManager — External service discovery (XEP-0215)
- QXmppRegistrationManager — In-band registration (XEP-0077)
- QXmppAccountMigrationManager — Account data migration (XEP-0227)
- QXmppMovedManager — Account migration hints (XEP-0283)
Legacy (deprecated)
- QXmppMucManager — superseded by QXmppMucManagerV2
- QXmppCarbonManager — superseded by QXmppCarbonManagerV2
- QXmppBookmarkManager — superseded by QXmppPepBookmarkManager
- QXmppArchiveManager — superseded by QXmppMamManager
- QXmppRpcManager — RPC (XEP-0009)
Low-Level Stanza API
For direct access to XMPP stanzas:
- QXmppIq
- QXmppMessage
- QXmppPresence