Эта возможность была реализована и исправлена еще в ранних версиях Qt5 (closed bugfix).
Небольшой пример использования:
// ...
// Откроем два соединения, одно для данных и транзакций, второе типа служебное
QSqlDatabase DataBase = QSqlDatabase::addDatabase("QPSQL","First");
QSqlDatabase TechBase = QSqlDatabase::addDatabase("QPSQL","Second");
// Инициализация
DataBase.setHostName("192.168.1.100");
DataBase.setDatabaseName("database");
DataBase.setUserName("pgsql");
DataBase.setPassword("password");
TechBase.setHostName("192.168.1.100");
TechBase.setDatabaseName("database");
TechBase.setUserName("pgsql");
TechBase.setPassword("password");
// Открытие базы
if (DataBase.open() && TechBase.open()) {
// Подписываемся на канал "Virtual"
if (!TechBase.driver()->subscribeToNotification("Virtual")) {
qDebug( qPrintable(TechBase.driver()->lastError().databaseText()));
} else {
// Подключаем слот для асинхронных уведомлений
connect(TechBase.driver(),
SIGNAL(notification(const QString &, QSqlDriver::NotificationSource, const QVariant &)),
this,
SLOT(SlotNotify(const QString &, QSqlDriver::NotificationSource, const QVariant &))
);
}
}
// ...
// А это реализация слота
void MainWindow::SlotNotify(const QString &iName,
QSqlDriver::NotificationSource iSource,
const QVariant &iPayload) {
// собственно в iPayload и прилетает искомый аргумент по каналу iName
qDebug() << "NOTIFY - Name:" << iName << ", Payload:" << iPayload.toString();
}
//...
Тестируем таким запросом из-вне:
NOTIFY "Virtual", 'Payload with many args'