PyQt学习笔记-使用通用数据库接口QtSql操作SQLite数据库

使用通用的数据库接口的好处是当数据库发生改变时,只需要修改初始化的配置即可,而不用修改对应的更多的代码。

一、QtSql类

QtSql类时的数据库操作接口类,包含如下类:

QSql

QSqlError

QSqlQueryModel

QSqlRelationalTableModel

QSqlDatabase

QSqlField

QSqlRecord

QSqlResult

QSqlDriver

QSqlIndex

QSqlRelation

QSqlTableModel

QSqlDriverCreatorBase

QSqlQuery

QSqlRelationalDelegate

二、数据库操作

2.1 创建数据库

通过QSqlDataBase连接数据,sqlite是文件形式存储到本地,所以设置文件名 进行访问,当数据库不存在时会自动创建数据库。

        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName(filePath)

2.2 打开数据库

直接调用open()方法打开数据,返回值是打开成功与否的标志。

        if not self.db.open():
            print("数据库连接失败!")
            return False
        else:
            print("数据库连接成功!")
            return True

2.3 创建表

通过QSqlQuery创建表,数据库打开后直接创建QSqlQuery对象即可,只添加一个数据库时为默认数据库,不需要指定数据库。

        query = QSqlQuery()
        query.exec(
            'create table test(id int primary key unique, name varchar(15), notes varchar(50))')
        self.db.close()

2.4 添加数据

使用sql直接添加数据,需要注意sql语句中,字符类型需要添加双引号“”。

        query.exec(
            f'insert into test values({test.id},"{test.name}","{test.notes}")')
        self.db.close()

2.5 使用model查询

使用QSqlTableModel查询操作数据,直接设置对应的表名,即可快速操作。

        model = QSqlTableModel()
        model.setTable("test")
        model.setEditStrategy(QSqlTableModel.EditStrategy.OnFieldChange)
        model.select()
        model.setHeaderData(0, Qt.Orientation.Horizontal, "ID")
        model.setHeaderData(1, Qt.Orientation.Horizontal, "Name")
        model.setHeaderData(2, Qt.Orientation.Horizontal, "Notes")
        return model

三、界面显示

添加一个简单的界面显示数据和基本操作

3.1 view

from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QTableView
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QGridLayout
from PyQt6.QtWidgets import QVBoxLayout


class MainWindowView(QMainWindow):
    """Main window view"""

    def __init__(self) -> None:

        super().__init__()
        self.init_ui()

    def init_ui(self):
        """Init ui"""

        self.resize(600, 200)
        self.mainwidget = QWidget()
        self.setCentralWidget(self.mainwidget)
        self.mainlayout = QGridLayout()
        self.mainwidget.setLayout(self.mainlayout)

        self.tv_main = QTableView()
        self.mainlayout.addWidget(self.tv_main, 0, 0)

        self.layout_edit = QVBoxLayout()
        self.mainlayout.addLayout(self.layout_edit, 0, 1)

        self.btn_add = QPushButton("Add")
        self.btn_add.setObjectName("btn_add")
        self.layout_edit.addWidget(self.btn_add)

        self.btn_delete = QPushButton("Delete")
        self.layout_edit.addWidget(self.btn_delete)

3.2 controller

# _*_ coding:utf-8 _*_

from PyQt6.QtCore import QObject
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QPushButton
from view.mainview import MainWindowView
from model.sqlitedb import SqliteDB


class MainWindowController(QObject):
    """The controller of main window."""

    def __init__(self) -> None:
        """Init"""

        super().__init__()

        self.mainview = MainWindowView()
        '''主窗体'''
        self.btn_add = self.mainview.findChild(QPushButton, "btn_add", Qt.FindChildOption.FindChildrenRecursively)
        """添加一行按钮"""
        self.btn_add.clicked.connect(self.addrow)
        self.btn_delete = self.mainview.btn_delete
        self.btn_delete.clicked.connect(lambda: self.model_testtable.removeRow(self.tv_main.currentIndex().row()))
        self.tv_main = self.mainview.tv_main
        '''主界面显示TableView'''
        self.tv_main.clicked.connect(self.tableselectedchanged)

        self.init_db()

        self.model_testtable = self.testdb.query_testtable()
        self.tv_main.setModel(self.model_testtable)

        self.mainview.show()

    def init_db(self):
        """Init database"""

        self.testdb = SqliteDB()
        dbpath = r".\zero.sqlite\db\test.db"
        print(dbpath)
        self.testdb.create_db(dbpath)
        self.testdb.create_testtable()

    def addrow(self):
        """添加一行"""

        self.model_testtable.insertRow(self.model_testtable.rowCount())

    def tableselectedchanged(self, item):
        """table selected"""

        self.selecteitem = item
        print("Selected Row:", str(self.selecteitem.row()))

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用以下代码来实现: ``` import sqlite3 from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem connection = sqlite3.connect("test.db") cursor = connection.cursor() cursor.execute("SELECT * FROM table_name") results = cursor.fetchall() app = QApplication([]) window = QMainWindow() table = QTableWidget() table.setRowCount(len(results)) table.setColumnCount(len(results[0])) for i, row in enumerate(results): for j, col in enumerate(row): table.setItem(i, j, QTableWidgetItem(str(col))) window.setCentralWidget(table) window.show() app.exec_() ``` ### 回答2: 使用Qt实时显示SQLite3数据库的代码,需要以下步骤: 1. 首先,需要在Qt中添加对SQLite3数据库的支持。在.pro文件中添加以下行: ``` QT += sql ``` 2. 在代码中引入SQLite3相关的头文件: ``` #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> ``` 3. 创建数据库连接和打开数据库: ``` QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("your_database_name.sqlite"); // 替换为你的数据库名称 if (!db.open()) { qDebug() << "Error opening database:" << db.lastError().text(); return; } ``` 4. 执行查询语句并获取结果: ``` QString queryStr = "SELECT * FROM your_table_name"; // 替换为你的表名 QSqlQuery query; if (!query.exec(queryStr)) { qDebug() << "Error executing query:" << query.lastError().text(); return; } while (query.next()) { // 获取每行的数据 QString column1 = query.value(0).toString(); // 替换为你的列名 QString column2 = query.value(1).toString(); // 替换为你的列名 //... // 在此处理显示数据的逻辑 qDebug() << "Column1:" << column1 << "Column2:" << column2; } ``` 5. 最后,关闭数据库连接: ``` db.close(); ``` 这样,你就可以使用Qt实时显示SQLite3数据库的数据了。请确保数据库和表名称是正确的,并按需修改代码。 ### 回答3: 使用Qt实时显示SQLite3数据库的代码,您可以按照以下步骤进行实现: 首先,在Qt项目中添加SQLite3的头文件和库文件。您可以从SQLite3的官方网站上下载最新版本的SQLite3,并将其包含到您的项目中。 然后,创建一个Qt的主窗口,并在窗口上添加一个QTableView控件用于显示数据库中的表格数据。 接下来,在窗口的构造函数中创建一个 QSqlDatabase 对象,并设置数据库的连接参数。例如,您可以指定数据库的文件路径、用户名、密码等。 然后,调用 QSqlDatabase::open() 方法打开数据库连接。 接着,使用 QSqlQuery 类来执行数据库查询语句,获取需要显示的数据。 将查询结果设置到一个 QSqlQueryModel 对象中,并将该模型对象设置为 QTableView 控件的数据源。 最后,调用窗口的 show() 方法显示窗口,启动应用程序后,即可实时显示 SQLite3 数据库中的数据。 下面是一个简单的示例代码: ```cpp #include <QApplication> #include <QtSql> #include <QTableView> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口 QMainWindow mainWindow; // 创建 TableView 控件 QTableView tableView(&mainWindow); // 创建数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("your_database_file.db"); // 打开数据库连接 if (!db.open()) { qDebug() << "Failed to connect to database!"; return 1; } // 执行数据库查询语句获取数据 QSqlQuery query; if (!query.exec("SELECT * FROM your_table")) { qDebug() << "Failed to execute query!"; return 1; } // 将查询结果设置到 QSqlQueryModel QSqlQueryModel model; model.setQuery(query); // 将模型对象设置为 TableView 的数据源 tableView.setModel(&model); // 设置 TableView 为主窗口的中央部件 mainWindow.setCentralWidget(&tableView); // 显示主窗口 mainWindow.show(); return app.exec(); } ``` 以上代码演示了如何使用 Qt 实时显示 SQLite3 数据库的内容。您可以根据您的具体需求修改代码来适应您的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼听禅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值