Использование уведомлений драйвера QPSQLDriver :: Cетевой уголок Majestio

Использование уведомлений драйвера QPSQLDriver


Эта возможность была реализована и исправлена еще в ранних версиях 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'
Рейтинг: 0/5 - 0 голосов