4

我使用 Qt 编写了一个 C++ 程序。我的算法中的一些变量在我的程序之外和网页中发生了变化。每次用户更改网页中的变量值时,我都会修改预先创建的 SQL 数据库。现在我希望我的代码在运行时更改变量值而不停止代码。有两种选择:

  1. 每 n 秒检查一次数据库并检索变量value- > 这不好,因为我必须检查数据库内容是否每 n 秒更改一次(可能多年来没有任何变化。另外我不想检查数据库是否内容变了)

  2. 每次更改数据库时,我的 Qt 程序都会发出一个信号,因此通过捕获该信号,我可以刷新变量值,这似乎是一个最佳解决方案,我想为此部分编写代码

我的代码的 C++ 部分是:

void Update Database()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("Mydataset");

    db.setUserName("user");
    db.setPassword("pass");

    if(!db.open())
    {
        qDebug()<<"Error is: "<<db.lastError();
        qFatal("Failed To Connect");
    }
    QSqlQuery qry;
    qry.exec("SELECT * from tblsystemoptions");
    QSqlRecord rec = qry.record();
    int cols = rec.count();
    qry.next();
    MCH = qry.value(0).toString();  //some global variables used in other functions
    MCh = qry.value(1).toString();
    // ... this goes on ...


}
4

2 回答 2

13

QSqlDriver支持在特定事件发生时发出信号的通知。要订阅事件,只需使用QSqlDriver::subscribeToNotification( const QString & name ). 当数据库发布您订阅的事件时,驱动程序将发出 notification() 信号,您的应用程序可以采取适当的措施。

db.driver()->subscribeToNotification("someEventId");

消息可以从触发器或存储过程自动发布。消息非常轻量:只不过是一个包含发生事件名称的字符串。

您可以将notification(const QString&)信号连接到您的插槽,例如:

QObject::connect(db.driver(), SIGNAL(notification(const QString&)), this, SLOT(refreshView()));

我应该注意到 MySQL 不支持此功能,因为它没有事件发布机制。

于 2014-04-07T17:31:16.027 回答
2

哪有这回事。Qt 事件循环和数据库没有以任何方式连接。您只需获取/更改/删除/插入/...数据,仅此而已。选项 1 是您必须做的。有一些方法可以在服务器端使用 TRIGGER 来启动外部脚本,但这对您没有多大帮助。

于 2014-04-07T15:28:33.740 回答