如何从 QML 访问 'in-memory' sqlite 数据库?

How can access 'in-memory' sqlite database from QML?

我使用 Qt-C++ 创建了一个内存中的 SQLite 数据库

const QString m_DRIVER = "QSQLITE";
QSqlDatabase m_db;
m_db = QSqlDatabase::addDatabase(m_DRIVER, "mkddb");
m_db.setDatabaseName(":memory:"); 

我的问题是如何在 QML 中访问它?

只要您在您的 class 中建立了数据库连接,例如。 Database Handler,你可以用一种非常简单的方式将它暴露给QML。以下是此类处理程序的一个非常简短的概念:

DatabaseHandler.h

class DatabaseHandler : public QObject
{
    Q_OBJECT
public:
    explicit DatabaseHandler(QObject *parent = nullptr);
    Q_INVOKABLE void addDatabaseEntry(QString queryString);

private:
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", "mkddb");
    QSqlQuery databaseQuery;
};

DatabaseHandler.cpp

DatabaseHandler::DatabaseHandler(QObject *parent) : QObject(parent)
{
    database.setDatabaseName(":memory:");
    database.open();
    databaseQuery = QSqlQuery(database);
}

void DatabaseHandler::addDatabaseEntry(QString queryString)
{
    databaseQuery.exec(queryString);
}

对象本身必须是 QObject 和上面代码中的 Q_OBJECT 宏。

DatabaseHandler 暴露给 QML,例如。 main.cpp 你必须这样写:

qmlRegisterType<DatabaseHandler>("com.organization.databasehandler", 1, 0, "DatabaseHandler");

然后在 QML 代码中您可以导入数据库处理程序并使用它的方法 只要它们是用宏声明的 Q_INVOKABLE 就像 [=20] =]:

import com.organization.databasehandler 1.0

ApplicationWindow {
    DatabaseHandler {
        id: databaseHandler
    }

    Button {
        onClicked: databaseHandler.addDatabaseEntry(/*Query to execute on the database*/)
    }
}