QTableView顯示SQLite數據


# coding:utf-8

from PyQt5.QtCore import Qt
from PyQt5 import QtGui,QtCore,QtWidgets,QtSql
import sys
class MainUi(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUi()

    # 初始化UI界面
    def initUi(self):
        # 設置窗口標題
        self.setWindowTitle("州的先生 - 在PyQt5中使用數據庫")
        # 設置窗口大小
        self.resize(600, 400)

        # 創建一個窗口部件
        self.widget = QtWidgets.QWidget()
        # 創建一個網格布局
        self.grid_layout = QtWidgets.QGridLayout()
        # 設置窗口部件的布局為網格布局
        self.widget.setLayout(self.grid_layout)

        # 創建一個按鈕組
        box = QtWidgets.QGroupBox('數據庫按鈕')
        self.group_box = box
        self.group_box_layout = QtWidgets.QVBoxLayout()
        self.group_box.setLayout(self.group_box_layout)
        # 創建一個表格部件
        self.table_widget = QtWidgets.QTableView()
        # 將上述兩個部件添加到網格布局中
        self.grid_layout.addWidget(self.group_box, 0, 0)
        self.grid_layout.addWidget(self.table_widget, 0, 1)

        # 創建按鈕組的按鈕
        self.b_create_db = QtWidgets.QPushButton("創建數據庫")
        self.b_create_db.clicked.connect(self.create_db)
        self.b_view_data = QtWidgets.QPushButton("瀏覽數據")
        self.b_view_data.clicked.connect(self.view_data)
        self.b_add_row = QtWidgets.QPushButton("添加一行")
        self.b_add_row.clicked.connect(self.add_row_data)
        self.b_delete_row = QtWidgets.QPushButton("刪除一行")
        self.b_delete_row.clicked.connect(self.del_row_data)
        self.b_close = QtWidgets.QPushButton("退出")
        self.b_close.clicked.connect(self.close)
        # 添加按鈕到按鈕組中
        self.group_box_layout.addWidget(self.b_create_db)
        self.group_box_layout.addWidget(self.b_view_data)
        self.group_box_layout.addWidget(self.b_add_row)
        self.group_box_layout.addWidget(self.b_delete_row)
        self.group_box_layout.addWidget(self.b_close)

        # 設置UI界面的核心部件
        self.setCentralWidget(self.widget)
    def create_db(self):
        try:
            # 調用輸入框獲取數據庫名稱
            # 調用輸入框獲取數據庫名稱
            db_text, db_action = QtWidgets.QInputDialog.getText(self, '數據庫名稱', '請輸入數據庫名稱', QtWidgets.QLineEdit.Normal)
            if (db_text.replace(' ', '') != '') and (db_action is True):
                print(db_text)
                self.db_name = db_text
                # 添加一個sqlite數據庫連接並打開
                db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
                db.setDatabaseName('{}.sqlite'.format(db_text))
                db.open()
                # 實例化一個查詢對象
                query = QtSql.QSqlQuery()
                # 創建一個數據庫表
                query.exec_("create table zmister(ID int primary key, "
                            "site_name varchar(20), site_url varchar(100))")
                # 插入三條數據
                query.exec_("insert into zmister values(1000, '州的先生', 'https://zmister.com')")
                query.exec_("insert into zmister values(1001, '百度', 'http://www.baidu.com')")
                query.exec_("insert into zmister values(1002, '騰訊', 'http://www.qq.com')")
                print('創建數據庫成功')
        except Exception as e:
            print(e)

    # 瀏覽數據
    def view_data(self):
        # 實例化一個可編輯數據模型
        self.model = QtSql.QSqlTableModel()
        self.table_widget.setModel(self.model)

        self.model.setTable('zmister')  # 設置數據模型的數據表
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)  # 允許字段更改
        self.model.select()  # 查詢所有數據
        # 設置表格頭
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, 'ID')
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, '站點名稱')
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, '站點地址')

    # 添加一行數據行
    def add_row_data(self):
        # 如果存在實例化的數據模型對象
        if self.model:
            self.model.insertRows(self.model.rowCount(), 1)
        else:
            self.create_db()

    # 刪除一行數據
    def del_row_data(self):
        if self.model:
            self.model.removeRow(self.table_widget.currentIndex().row())
        else:
            self.create_db()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    form = MainUi()
    form.show()
    sys.exit(app.exec_())
mysql數據庫連接
db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('主機名')
db.setDatabaseName('數據庫名')
db.setUserName('用戶名')
db.setPassword('密碼')
db.open()


image


分頁顯示
'''

分頁顯示數據

limit n,m

limit 10,20


'''

import sys
import re
from PyQt5.QtWidgets import*
from PyQt5.QtCore import Qt
from PyQt5.QtSql import *




class DataGrid(QWidget):
    def createTableAndInit(self):
        # 添加數據庫
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        # 設置數據庫名稱
        self.db.setDatabaseName('./db/database.db')
        # 判斷是否打開
        if not self.db.open():
            return False

        # 聲明數據庫查詢對象
        query = QSqlQuery()
        # 創建表
        query.exec("create table student(id int primary key, name vchar, sex vchar, age int, deparment vchar)")

        # 添加記錄
        query.exec("insert into student values(1,'張三1','男',20,'計算機')")
        query.exec("insert into student values(2,'李四1','男',19,'經管')")
        query.exec("insert into student values(3,'王五1','男',22,'機械')")
        query.exec("insert into student values(4,'趙六1','男',21,'法律')")
        query.exec("insert into student values(5,'小明1','男',20,'英語')")
        query.exec("insert into student values(6,'小李1','女',19,'計算機')")
        query.exec("insert into student values(7,'小張1','男',20,'機械')")
        query.exec("insert into student values(8,'小剛1','男',19,'經管')")
        query.exec("insert into student values(9,'張三2','男',21,'計算機')")
        query.exec("insert into student values(10,'張三3','女',20,'法律')")
        query.exec("insert into student values(11,'王五2','男',19,'經管')")
        query.exec("insert into student values(12,'張三4','男',20,'計算機')")
        query.exec("insert into student values(13,'小李2','男',20,'機械')")
        query.exec("insert into student values(14,'李四2','女',19,'經管')")
        query.exec("insert into student values(15,'趙六3','男',21,'英語')")
        query.exec("insert into student values(16,'李四2','男',19,'法律')")
        query.exec("insert into student values(17,'小張2','女',22,'經管')")
        query.exec("insert into student values(18,'李四3','男',21,'英語')")
        query.exec("insert into student values(19,'小李3','女',19,'法律')")
        query.exec("insert into student values(20,'王五3','女',20,'機械')")
        query.exec("insert into student values(21,'張三4','男',22,'計算機')")
        query.exec("insert into student values(22,'小李2','男',20,'法律')")
        query.exec("insert into student values(23,'張三5','男',19,'經管')")
        query.exec("insert into student values(24,'小張3','女',20,'計算機')")
        query.exec("insert into student values(25,'李四4','男',22,'英語')")
        query.exec("insert into student values(26,'趙六2','男',20,'機械')")
        query.exec("insert into student values(27,'小李3','女',19,'英語')")
        query.exec("insert into student values(28,'王五4','男',21,'經管')")

        return True

    def __init__(self):
        super().__init__()
        self.setWindowTitle("分頁查詢例子")
        self.resize(750, 300)
        self.createTableAndInit()

        # 當前頁
        self.currentPage = 0
        # 總頁數
        self.totalPage = 0
        # 總記錄數
        self.totalRecrodCount = 0
        # 每頁顯示記錄數
        self.PageRecordCount = 6

        self.initUI()

    def initUI(self):
        # 創建窗口
        self.createWindow()
        # 設置表格
        self.setTableView()

        # 信號槽連接
        self.prevButton.clicked.connect(self.onPrevButtonClick)
        self.nextButton.clicked.connect(self.onNextButtonClick)
        self.switchPageButton.clicked.connect(self.onSwitchPageButtonClick)

    def closeEvent(self, event):
        # 關閉數據庫
        self.db.close()

    # 創建窗口
    def createWindow(self):
        # 操作布局
        operatorLayout = QHBoxLayout()
        self.prevButton = QPushButton("前一頁")
        self.nextButton = QPushButton("后一頁")
        self.switchPageButton = QPushButton("Go")
        self.switchPageLineEdit = QLineEdit()
        self.switchPageLineEdit.setFixedWidth(40)

        switchPage = QLabel("轉到第")
        page = QLabel("頁")
        operatorLayout.addWidget(self.prevButton)
        operatorLayout.addWidget(self.nextButton)
        operatorLayout.addWidget(switchPage)
        operatorLayout.addWidget(self.switchPageLineEdit)
        operatorLayout.addWidget(page)
        operatorLayout.addWidget(self.switchPageButton)
        operatorLayout.addWidget(QSplitter())

        # 狀態布局
        statusLayout = QHBoxLayout()
        self.totalPageLabel = QLabel()
        self.totalPageLabel.setFixedWidth(70)
        self.currentPageLabel = QLabel()
        self.currentPageLabel.setFixedWidth(70)

        self.totalRecordLabel = QLabel()
        self.totalRecordLabel.setFixedWidth(70)

        statusLayout.addWidget(self.totalPageLabel)
        statusLayout.addWidget(self.currentPageLabel)
        statusLayout.addWidget(QSplitter())
        statusLayout.addWidget(self.totalRecordLabel)

        # 設置表格屬性
        self.tableView = QTableView()
        # 表格寬度的自適應調整
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 創建界面
        mainLayout = QVBoxLayout(self);
        mainLayout.addLayout(operatorLayout);
        mainLayout.addWidget(self.tableView);
        mainLayout.addLayout(statusLayout);
        self.setLayout(mainLayout)

    # 設置表格
    def setTableView(self):

        # 聲明查詢模型
        self.queryModel = QSqlQueryModel(self)
        # 設置當前頁
        self.currentPage = 1;
        # 得到總記錄數
        self.totalRecrodCount = self.getTotalRecordCount()
        # 得到總頁數
        self.totalPage = self.getPageCount()
        # 刷新狀態
        self.updateStatus()
        # 設置總頁數文本
        self.setTotalPageLabel()
        # 設置總記錄數
        self.setTotalRecordLabel()

        # 記錄查詢
        self.recordQuery(0)
        # 設置模型
        self.tableView.setModel(self.queryModel)

        print('totalRecrodCount=' + str(self.totalRecrodCount))
        print('totalPage=' + str(self.totalPage))

        # 設置表格表頭
        self.queryModel.setHeaderData(0, Qt.Horizontal, "編號")
        self.queryModel.setHeaderData(1, Qt.Horizontal, "姓名")
        self.queryModel.setHeaderData(2, Qt.Horizontal, "性別")
        self.queryModel.setHeaderData(3, Qt.Horizontal, "年齡")
        self.queryModel.setHeaderData(4, Qt.Horizontal, "院系")

    # 得到記錄數
    def getTotalRecordCount(self):
        self.queryModel.setQuery("select * from student")
        rowCount = self.queryModel.rowCount()
        print('rowCount=' + str(rowCount))
        return rowCount

    # 得到頁數
    def getPageCount(self):
        if self.totalRecrodCount % self.PageRecordCount == 0:
            return (self.totalRecrodCount / self.PageRecordCount)
        else:
            return (self.totalRecrodCount / self.PageRecordCount + 1)

    # 記錄查詢
    def recordQuery(self, limitIndex):
        szQuery = ("select * from student limit %d,%d" % (limitIndex, self.PageRecordCount))
        print('query sql=' + szQuery)
        self.queryModel.setQuery(szQuery)

    # 刷新狀態
    def updateStatus(self):
        szCurrentText = ("當前第%d頁" % self.currentPage)
        self.currentPageLabel.setText(szCurrentText)

        # 設置按鈕是否可用
        if self.currentPage == 1:
            self.prevButton.setEnabled(False)
            self.nextButton.setEnabled(True)
        elif self.currentPage == self.totalPage:
            self.prevButton.setEnabled(True)
            self.nextButton.setEnabled(False)
        else:
            self.prevButton.setEnabled(True)
            self.nextButton.setEnabled(True)

    # 設置總數頁文本
    def setTotalPageLabel(self):
        szPageCountText = ("總共%d頁" % self.totalPage)
        self.totalPageLabel.setText(szPageCountText)

    # 設置總記錄數
    def setTotalRecordLabel(self):
        szTotalRecordText = ("共%d條" % self.totalRecrodCount)
        print('*** setTotalRecordLabel szTotalRecordText=' + szTotalRecordText)
        self.totalRecordLabel.setText(szTotalRecordText)

    # 前一頁按鈕按下
    def onPrevButtonClick(self):
        print('*** onPrevButtonClick ');
        limitIndex = (self.currentPage - 2) * self.PageRecordCount
        self.recordQuery(limitIndex)
        self.currentPage -= 1
        self.updateStatus()

    # 后一頁按鈕按下
    def onNextButtonClick(self):
        print('*** onNextButtonClick ');
        limitIndex = self.currentPage * self.PageRecordCount
        self.recordQuery(limitIndex)
        self.currentPage += 1
        self.updateStatus()

    # 轉到頁按鈕按下
    def onSwitchPageButtonClick(self):
        # 得到輸入字符串
        szText = self.switchPageLineEdit.text()


        # 得到頁數
        pageIndex = int(szText)
        # 判斷是否有指定頁
        if pageIndex > self.totalPage or pageIndex < 1:
            QMessageBox.information(self, "提示", "沒有指定的頁面,請重新輸入")
            return

        # 得到查詢起始行號
        limitIndex = (pageIndex - 1) * self.PageRecordCount

        # 記錄查詢
        self.recordQuery(limitIndex);
        # 設置當前頁
        self.currentPage = pageIndex
        # 刷新狀態
        self.updateStatus();


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 創建窗口
    example = DataGrid()
    # 顯示窗口
    example.show()
    sys.exit(app.exec_())

image

使用可視化的方式對SQLite數據庫進行增、刪、改、查操作
'''

使用可視化的方式對SQLite數據庫進行增、刪、改、查操作


QTableView

QSqlTableModel


'''
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtSql import *

def initializeModel(model):
    model.setTable('people')
    model.setEditStrategy(QSqlTableModel.OnFieldChange)
    model.select()
    model.setHeaderData(0, Qt.Horizontal,'ID')
    model.setHeaderData(1, Qt.Horizontal, '姓名')
    model.setHeaderData(2, Qt.Horizontal, '地址')

def createView(title,model):
    view = QTableView()
    view.setModel(model)
    view.setWindowTitle(title)
    return view
def findrow(i):
    delrow = i.row()
    print('del row=%s' % str(delrow))
def addrow():
    ret = model.insertRows(model.rowCount(),1)
    print('insertRow=%s' % str(ret))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    db = QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('./db/database.db')
    model = QSqlTableModel()
    delrow = -1
    initializeModel(model)
    view = createView("展示數據",model)
    view.clicked.connect(findrow)

    dlg = QDialog()
    layout = QVBoxLayout()
    layout.addWidget(view)
    addBtn = QPushButton('添加一行')
    addBtn.clicked.connect(addrow)

    delBtn = QPushButton('刪除一行')
    delBtn.clicked.connect(lambda :model.removeRow(view.currentIndex().row()))
    layout.addWidget(view)
    layout.addWidget(addBtn)
    layout.addWidget(delBtn)
    dlg.setLayout(layout)
    dlg.setWindowTitle("Database Demo")
    dlg.resize(500,400)
    dlg.show()
    sys.exit(app.exec())
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM