您的位置:首页 > 汽车 > 时评 > 响应式网页需要设计几张图_广东省政府疫情防控新闻发布会_公司营销网站建设_搜索引擎关键词怎么优化

响应式网页需要设计几张图_广东省政府疫情防控新闻发布会_公司营销网站建设_搜索引擎关键词怎么优化

2025/3/13 21:28:07 来源:https://blog.csdn.net/weixin_63577471/article/details/146040716  浏览:    关键词:响应式网页需要设计几张图_广东省政府疫情防控新闻发布会_公司营销网站建设_搜索引擎关键词怎么优化
响应式网页需要设计几张图_广东省政府疫情防控新闻发布会_公司营销网站建设_搜索引擎关键词怎么优化

文章目录

前言

一、项目结构

二、配置 .pro 文件

三、创建 Database 类

3.1 database.h

3.2 database.cpp

 四、main.cpp

  五、编写 QML 界面

  六、实验现象


前言

在现代应用程序开发中,数据库操作是不可或缺的一部分。Qt 提供了强大的 QtSql 模块,可以轻松地与 SQLite 数据库进行交互。本文将详细介绍如何使用 QML 和 C++ 后端实现 SQLite 数据库的增删改查(CRUD)操作。


一、项目结构

项目的文件结构如下:

qml_SQLite_demo1/
├── database.h
├── database.cpp
├── main.cpp
├── main.qml
├── qml.qrc
└── sqlite_crud.pro

二、配置 .pro 文件

首先,在 .pro 文件中启用 Sql 模块,并配置项目的基本信息。

TEMPLATE = app
QT += qml quick widgets core gui sql
CONFIG += c++17
SOURCES += main.cpp database.cpp
HEADERS += database.h
RESOURCES += qml.qrc

三、创建 Database 类

Database 类负责处理数据库的打开、关闭以及增删改查操作。

3.1 database.h

#ifndef DATABASE_H
#define DATABASE_H#include <QObject>
#include <QSqlDatabase>
#include <QVariantList>class Database : public QObject
{Q_OBJECT
public:explicit Database(QObject *parent = nullptr);~Database();Q_INVOKABLE bool openDatabase(const QString &path);Q_INVOKABLE QVariantList executeQuery(const QString &query, const QVariantList &params = QVariantList());Q_INVOKABLE bool executeNonQuery(const QString &query, const QVariantList &params = QVariantList());private:QSqlDatabase db;
};#endif // DATABASE_H

3.2 database.cpp

#include "database.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlRecord>
#include <QDebug>Database::Database(QObject *parent) : QObject(parent)
{
}Database::~Database()
{if (db.isOpen()) {db.close();}
}bool Database::openDatabase(const QString &path)
{db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(path);if (!db.open()) {qWarning() << "Failed to open database:" << db.lastError().text();return false;}return true;
}QVariantList Database::executeQuery(const QString &query, const QVariantList &params)
{QVariantList result;QSqlQuery sqlQuery;sqlQuery.prepare(query);for (const QVariant &param : params) {sqlQuery.addBindValue(param);}if (sqlQuery.exec()) {while (sqlQuery.next()) {QVariantMap row;for (int i = 0; i < sqlQuery.record().count(); i++) {row[sqlQuery.record().fieldName(i)] = sqlQuery.value(i);}result.append(row);}} else {qWarning() << "Query failed:" << sqlQuery.lastError().text();}return result;
}bool Database::executeNonQuery(const QString &query, const QVariantList &params)
{QSqlQuery sqlQuery;sqlQuery.prepare(query);for (const QVariant &param : params) {sqlQuery.addBindValue(param);}if (!sqlQuery.exec()) {qWarning() << "Query failed:" << sqlQuery.lastError().text();return false;}return true;
}

 四、main.cpp

在 main.cpp 中,我们将 Database 类注册到 QML 中,并初始化数据库。

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "database.h"
#include <QDir>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QQmlApplicationEngine engine;// 创建 Database 对象Database database;// 将 Database 对象注册到 QML 中engine.rootContext()->setContextProperty("database", &database);// 设置数据库文件路径QString dbPath = QDir::currentPath() + "/MyDatabase.db";qDebug() << "Database path:" << dbPath; // 打印数据库文件路径// 打开数据库if (!database.openDatabase(dbPath)) {qWarning() << "Failed to open database!";return -1;}// 加载 QML 文件const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

  五、编写 QML 界面

在 main.qml 中,我们设计一个简单的界面,用于展示数据并实现增删改查操作。

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12ApplicationWindow {visible: truewidth: 800height: 600title: "SQLite CRUD Example"// 数据模型ListModel {id: dataModel}ColumnLayout {anchors.fill: parentspacing: 10anchors.margins: 20// 操作按钮RowLayout {spacing: 10Button {text: "添加"onClicked: addDialog.open()}Button {text: "修改"enabled: listView.currentIndex >= 0onClicked: editDialog.open()}Button {text: "删除"enabled: listView.currentIndex >= 0onClicked: deleteItem()}Button {text: "刷新"onClicked: loadData()}}// 表头Row {spacing: 0Repeater {model: ["ID", "姓名", "年龄"]Rectangle {width: [100, 200, 100][index]height: 30color: "#f0f0f0"Text {text: modelDataanchors.centerIn: parentfont.bold: true}}}}// 数据表格ListView {id: listViewmodel: dataModelLayout.fillWidth: trueLayout.fillHeight: truespacing: 1clip: truedelegate: Rectangle {width: listView.widthheight: 30color: ListView.isCurrentItem ? "#d3d3d3" : "white"Row {spacing: 0Rectangle {width: 100height: 30color: "transparent"Text {text: modelData.idanchors.centerIn: parent}}Rectangle {width: 200height: 30color: "transparent"Text {text: modelData.nameanchors.centerIn: parent}}Rectangle {width: 100height: 30color: "transparent"Text {text: modelData.ageanchors.centerIn: parent}}}}}}// 添加对话框Dialog {id: addDialogtitle: "添加数据"width: 400height: 200ColumnLayout {anchors.fill: parentspacing: 10TextField {id: addNameFieldplaceholderText: "请输入姓名"Layout.fillWidth: true}TextField {id: addAgeFieldplaceholderText: "请输入年龄"Layout.fillWidth: true}RowLayout {Button {text: "取消"onClicked: addDialog.close()}Button {text: "确定"onClicked: {database.executeNonQuery("INSERT INTO People (name, age) VALUES (?, ?)", [addNameField.text, parseInt(addAgeField.text)]);loadData();addDialog.close();}}}}}// 修改对话框Dialog {id: editDialogtitle: "修改数据"width: 400height: 200property var currentItem: nullColumnLayout {anchors.fill: parentspacing: 10TextField {id: editNameFieldplaceholderText: "请输入姓名"text: editDialog.currentItem ? editDialog.currentItem.name : ""Layout.fillWidth: true}TextField {id: editAgeFieldplaceholderText: "请输入年龄"text: editDialog.currentItem ? editDialog.currentItem.age : ""Layout.fillWidth: true}RowLayout {Button {text: "取消"onClicked: editDialog.close()}Button {text: "确定"onClicked: {database.executeNonQuery("UPDATE People SET name = ?, age = ? WHERE id = ?", [editNameField.text, parseInt(editAgeField.text), editDialog.currentItem.id]);loadData();editDialog.close();}}}}}// 加载数据function loadData() {var data = database.executeQuery("SELECT * FROM People");dataModel.clear();data.forEach(function(item) {dataModel.append(item);});}// 删除数据function deleteItem() {var item = dataModel.get(listView.currentIndex);database.executeNonQuery("DELETE FROM People WHERE id = ?", [item.id]);loadData();}// 初始化Component.onCompleted: {database.executeNonQuery("CREATE TABLE IF NOT EXISTS People (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");loadData();}
}

  六、实验现象

在运行程序后,将在项目文件夹下创建.db数据库文件,并且可以在QML界面中实现对数据库的增删改查:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com