Здравствуйте!
Задался на первый взгляд простой задачкой: при изменении значения таблицы базы данных из одного окна, чтобы в другом окне обновлялись результаты отображения данной таблицы.
Погуглил, нашел тему на данном форуме.
К таблице дописываю правило:
CREATE OR REPLACE RULE notify_report_rule AS
ON UPDATE TO report DO
NOTIFY report_update;
В заголовочном файле пишу:
void slotGetNotify(const QString& notification); //Изменена таблица report в БД
в конструкторе окна:
QSqlDatabase::database().driver()->subscribeToNotification("report_update");
connect(QSqlDatabase::database().driver(), SIGNAL(notification(const QString&)), this,
SLOT( slotGetNotify(const QString&) ) );
//Изменена таблица report в БД
выдает следующее:
QPSQLDriver::subscribeToNotificationImplementation: already subscribing to 'report_update'.
Если я правильно мыслю, то в данном случае необходимо создавать второе подключение к базе?
Попробовал другой путь:
на уровне базы данных создал триггер и функцию
CREATE OR REPLACE FUNCTION report_stamp()
RETURNS trigger AS
$BODY$
BEGIN
-- Check update reportn_report and reportr_report in report table
IF UPDATE.reportn_report
THEN
NOTIFY virtual;
END IF;
IF UPDATE.reportr_report
THEN
NOTIFY virtual;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION report_stamp()
OWNER TO postgres;
В таком случае в QSqlTableModel данные просто не отображаются.
И, если возможно, реализовать триггер и функцию на уровне СУБД, то как это перехватывать в классе? Также с помощью:
connect(QSqlDatabase::database().driver(), SIGNAL(notification(const QString&)), this,
SLOT( slotGetNotify(const QString&) ) );
?
Qt 4.8, Postgre 9.0.1