用PYQT5实现非常sqlite简单数据显示编辑

目录 复制

目录

  • 主要思路
    • 链接数据库
    • cachedTable
    • treeview
  • 代码实现
  • 界面实现
  • 功能介绍
  • 截图

主要思路

链接数据库

     self.db = QSqlDatabase.addDatabase("QSQLITE")filename = os.path.join(os.path.dirname(__file__),self.data_file)self.db.setDatabaseName(filename)if not self.db.open():alert = QMessageBox()alert.setText(self.db.lastError().text())alert.exec_()

cachedTable

model.setEditStrategy(QSqlTableModel.OnManualSubmit)

treeview

        self.tree_model.clear()self.tree_model.setHorizontalHeaderLabels(['Name', 'Type','Schema'])self.cvquery = QSqlQuery()sql = u"SELECT name from sqlite_master where type = 'table' order by name"if self.cvquery.exec_(sql):while self.cvquery.next():str_v = self.cvquery.value(0)tab = QStandardItem('%ss (%d)' % (str_v,0))self.tree_model.appendRow(tab)driver = self.db.driver()rec = driver.record(str_v)for i in range(rec.count()):col_name = QStandardItem(rec.field(i).name())type_id=rec.field(i).type()if type_id in TYPE_DICT: type_str=TYPE_DICT[type_id]else: type_str=str(type_id)col_type=QStandardItem(type_str)tab.appendRow([col_name, col_type])

代码实现

# coding=utf-8
import sys
import osfrom PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5 import uic
from PyQt5 import QtCoreTYPE_DICT={1:"BOOLEAN", 2:"INTEGER",6:"NUMERIC", 10:"TEXT", 12:"BLOB",13:"DATE"}class WindowClass(QMainWindow):def __init__(self,parent=None):QMainWindow.__init__(self)self.resize(800,480)self.setWindowTitle("SQLite GUI")self.initUI()self.tree_model = QStandardItemModel()self.treeView.setModel(self.tree_model)def initUI(self):uic.loadUi('sqlite.ui',self)def load_sqlite(self):path, _ = QFileDialog.getOpenFileName(self, u"打开sqlite文件",os.getcwd(), "sqlite db(*.db)")if path:self.data_file = pathself.connect_db()def load_table(self):str_arr = []if not self.db.open():returnself.cvquery = QSqlQuery()sql = u"SELECT name from sqlite_master where type = 'table' order by name"if self.cvquery.exec_(sql):while self.cvquery.next():str_v = self.cvquery.value(0)str_arr.append(str_v)return str_arrdef connect_db(self):self.db = QSqlDatabase.addDatabase("QSQLITE")filename = os.path.join(os.path.dirname(__file__),self.data_file)self.db.setDatabaseName(filename)if not self.db.open():alert = QMessageBox()alert.setText(self.db.lastError().text())alert.exec_()# self.load_table_group()tb_names = self.load_table()self.table_selector.clear()for name in tb_names:self.table_selector.addItem(name)self.update_tables_table()def update_tables_table(self):self.tree_model.clear()self.tree_model.setHorizontalHeaderLabels(['Name', 'Type','Schema'])if not self.db.open():returnself.cvquery = QSqlQuery()sql = u"SELECT name from sqlite_master where type = 'table' order by name"if self.cvquery.exec_(sql):while self.cvquery.next():str_v = self.cvquery.value(0)tab = QStandardItem('%ss (%d)' % (str_v,0))self.tree_model.appendRow(tab)driver = self.db.driver()rec = driver.record(str_v)for i in range(rec.count()):col_name = QStandardItem(rec.field(i).name())type_id=rec.field(i).type()if type_id in TYPE_DICT: type_str=TYPE_DICT[type_id]else: type_str=str(type_id)col_type=QStandardItem(type_str)tab.appendRow([col_name, col_type])def close_db(self):if self.db:if self.db.isOpen():passdef on_tableView_currentItemChanged(self,pre,current):print("edit")# twitem.setBackgroundColor(QColor(0,60,10))# ui binding @QtCore.pyqtSlot()def on_actionNew_triggered(self):save_file_dialog = QFileDialog.getSaveFileName(self, "Name of new database")if save_file_dialog[0]:self.loadDatabase(save_file_dialog[0])@QtCore.pyqtSlot()def on_actionOpen_triggered(self):self.load_sqlite()@QtCore.pyqtSlot(str)    def on_table_selector_currentIndexChanged(self,tbl_name):if tbl_name:model = QSqlTableModel()model.setTable('"'+tbl_name+'"')model.setEditStrategy(QSqlTableModel.OnManualSubmit)# model.setEditStrategy(QSqlTableModel.OnFieldChange)model.select()# self.error_check(model)sself.tableView.setModel(model)self.tableView.model().dataChanged.connect(self.changed)def changed(self,i,j):# item = self.tableView.model().index(i.row(),i.column())# model->item(i,0)->setForeground(QBrush(QColor(255, 0, 0)));# self.tableView.model().record(num).value(1).toString()pass@QtCore.pyqtSlot()    def on_deleteRecordButton_pressed(self):model = self.tableView.model()model.removeRow(self.tableView.currentIndex().row())model.submitAll()model.select()# QMessageBox.warning(self, "Delete",#                 "The database reported an error: %s" % model.lastError().text())@QtCore.pyqtSlot()    def on_newRecordButton_pressed(self):model = self.tableView.model()model.submitAll()result = model.insertRows(model.rowCount(), 1)if not result:self.error_check(model)@QtCore.pyqtSlot()  def on_submitChange_pressed(self):model = self.tableView.model()model.database().transaction()if model.submitAll():model.database().commit()else:model.database().rollback()QMessageBox.warning(self, "Cached Table","The database reported an error: %s" % self.model.lastError().text())@QtCore.pyqtSlot()  def on_rollback_pressed(self):model = self.tableView.model()model.database().transaction()model.revertAll();if __name__ == '__main__':app = QApplication([])mw = WindowClass()mw.show()app.exec_()

界面实现

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>1096</width><height>754</height></rect></property><property name="windowTitle"><string>SQLite GUI</string></property><widget class="QWidget" name="centralwidget"><property name="enabled"><bool>true</bool></property><property name="sizePolicy"><sizepolicy hsizetype="Expanding" vsizetype="Expanding"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QSplitter" name="splitter"><property name="orientation"><enum>Qt::Horizontal</enum></property><widget class="QTreeView" name="treeView"/><widget class="QWidget" name="Edit_widget" native="true"><property name="enabled"><bool>true</bool></property><property name="sizePolicy"><sizepolicy hsizetype="Expanding" vsizetype="Expanding"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property><layout class="QGridLayout" name="gridLayout"><item row="0" column="0"><layout class="QGridLayout" name="gridLayout_2"><item row="0" column="0"><widget class="QLabel" name="label_2"><property name="text"><string>Table:</string></property></widget></item><item row="0" column="1"><widget class="QComboBox" name="table_selector"><property name="sizePolicy"><sizepolicy hsizetype="Expanding" vsizetype="Fixed"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property><property name="minimumSize"><size><width>150</width><height>0</height></size></property></widget></item></layout></item><item row="0" column="1"><widget class="QPushButton" name="reloadTableButton"><property name="text"><string/></property><property name="icon"><iconset><normaloff>sc_refresh.png</normaloff>sc_refresh.png</iconset></property></widget></item><item row="0" column="6"><widget class="QPushButton" name="deleteRecordButton"><property name="text"><string>Delete Record</string></property><property name="icon"><iconset><normaloff>sc_deleterecord.png</normaloff>sc_deleterecord.png</iconset></property></widget></item><item row="0" column="3"><widget class="QPushButton" name="submitChange"><property name="text"><string>Submit</string></property></widget></item><item row="0" column="2"><spacer name="horizontalSpacer"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeHint" stdset="0"><size><width>288</width><height>20</height></size></property></spacer></item><item row="0" column="5"><widget class="QPushButton" name="newRecordButton"><property name="text"><string>New Record</string></property><property name="icon"><iconset><normaloff>sc_newrecord.png</normaloff>sc_newrecord.png</iconset></property></widget></item><item row="0" column="4"><widget class="QPushButton" name="rollback"><property name="text"><string>Rollback</string></property></widget></item><item row="1" column="0" colspan="7"><widget class="QTableView" name="tableView"/></item></layout></widget></widget></item></layout></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>1096</width><height>22</height></rect></property><widget class="QMenu" name="menuFile"><property name="title"><string>File</string></property><addaction name="actionNew"/><addaction name="actionOpen"/><addaction name="actionRecent_Files"/><addaction name="separator"/><addaction name="actionQuit"/></widget><widget class="QMenu" name="menuHelp"><property name="title"><string>Help</string></property><addaction name="actionAbout"/></widget><addaction name="menuFile"/><addaction name="menuHelp"/></widget><widget class="QStatusBar" name="statusbar"/><action name="actionNew"><property name="text"><string>New</string></property><property name="shortcut"><string>Ctrl+N</string></property></action><action name="actionOpen"><property name="text"><string>Open</string></property><property name="shortcut"><string>Ctrl+O</string></property></action><action name="actionRecent_Files"><property name="text"><string>Recent Files</string></property></action><action name="actionQuit"><property name="text"><string>Quit</string></property></action><action name="actionAbout"><property name="text"><string>About</string></property></action></widget><resources/><connections/>
</ui>

功能介绍

解决的问题:
初级的GUI界面,可以修改或批量撤销修改

待解决的问题:

  • 目前只能显示表和修改表
  • 编辑过的单元格如何高亮显示
  • 删除行是直接执行的,无法用database().revertAll()恢复
  • 近期使用文件未显示

截图

用PYQT5实现非常基本sqlite的编辑器相关推荐

  1. Python: pyqt5 自己写一个窗口文本编辑器

    PyQt5是Digia的一套Qt5应用框架与python的结合,同时支持2.x和3.x.Qt库由Riverbank Computing开发,是最强大的GUI库之一. >>> 今天,我 ...

  2. 我喜爱的FireFox插件

    FireFox的插件很多,很好,但是多了就乱了,我只喜欢用其中几个: *1.All-in-One Sidebar; *2.IE Tab:IE浏览器切换: https://addons.mozilla. ...

  3. Java的笔记开源软件_jnote

    软件简介 jnote是一个开源的笔记软件,类似于Evernote,wiz,麦库,界面也是参考他们做的.当初做只是为了做一个自己可以定制的笔记软件. 目前完成的功能: 1.新建日记,参考wiz的日记功能 ...

  4. tp5支持啥数据库_等啥呢,进来看球啊!!!

    专注每日分享 ◆各位早上好~我是久夜◆ 帅哥美女们早上好~我是久夜~ 老是有朋友天天找我要能看NBA直播的软件,久夜我是废了好大的劲才搞来这么一个,这不赶紧给大家分享来了. 黑白直播不知道大家听过没有 ...

  5. android 飞行模式 配置 wifi可用,飞行模式也能用Wi-Fi

    Android手机的飞行模式就是一竿子关闭包括通讯.Wi-Fi.蓝牙和NFC在内的所有无线功能.但有时我们只需飞行模式的省电,却又希望单独开启Wi-Fi,此时应该如何设置呢? 以OPPO手机为例,RO ...

  6. android 飞行模式 wifi,飞行模式下怎么使用WiFi 飞行模式下开WiFi方法

    大家在使用Android手机的飞行模式时一般会遇到这样的问题,就是在飞行模式下,通讯.Wi-Fi.蓝牙和NFC在内的所有无线功能都会关闭,可是有时我们只需飞行模式的省电,却又希望单独开启Wi-Fi,此 ...

  7. android飞行模式开启wifi,手机在飞行模式下怎么使用WiFi? 飞行模式下开启WiFi的方法图文教程详细介绍[多图]...

    类型: 大小: 评分: 平台: 标签: 手机在飞行模式下怎么使用WiFi?相信很多朋友都还不太清楚吧?没关系,下面是友情小编搜集相关资料整理出来的手机在飞行模式下开启WiFi的方法图文教程详细介绍,希 ...

  8. android程序db文件用什么编辑器,在 Android Studio 上调试数据库 ( SQLite )

    以前 Eclipse 时代,调试 SQLite 都是将数据库文件导出到电脑,然后再用软件打开查看.现在我们用 Android Studio,有没有更方便的方法呢? SQLScout 安装 SQLSco ...

  9. qpython3编辑器怎么用_Python快速入门系列:Pyqt5界面开发好帮手-Qss样式编辑器介绍...

    Python + Pyqt5界面开发时,总是需要考虑美化界面,QssStylesheetEditor 是一个功能强大的 Qt 样式表(QSS)编辑器,支持实时预览,自动提示,自定义变量. 功能简介 Q ...

最新文章

  1. 长春8中2021年高考 成绩查询,长春八中2018高考喜报成绩、本科重本上线人数情况...
  2. python的异常处理机制
  3. Linux内核引导简析
  4. 某中学的排课管理系统_某中学的排课管理系统(SQL的简单应用)
  5. 针对双系统ubuntu16.04卡死及系统没有声音解决方法
  6. mysql数据库sql审核_Inception SQL审核注解
  7. sharepoint2007就地升级2010系列(三)升级系统
  8. mysql 常用配置
  9. C#中,接口继承、基类继承中父类与基类的执行顺序
  10. 深圳绘制SVG地图数据
  11. 博客背景壁纸推荐(一)CSDN图床
  12. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
  13. 海康威视错误代码说明
  14. Leetcode-数据结构-1.两数之和
  15. jzoj5935小凯学数学
  16. git删除远端分支命令
  17. 信息安全技术 关键信息基础设施安全保护要求
  18. 强类型c语言 类型
  19. cmos逻辑门传输延迟时间_用DSLogic 逻辑分析仪 解析出来的IIC协议太完美了!
  20. AssertionError: Torch not compiled with CUDA enabled到底是什么原因

热门文章

  1. 组织人事类主数据业务梳理以及流程编排
  2. html页面国际化之谷歌翻译js实践,支持通过判断浏览器语言自动将中文翻译成英文
  3. 学习方法 | 玩开源如何具有“趟坑” 的意识?
  4. bootstrap手风琴_快速提示:如何自定义Bootstrap 4的手风琴组件
  5. 如何在12315网上投诉平台把内容复制粘贴到投诉内容那里的解决方法
  6. 【Unity】内存泄漏危害及处理方式(腾讯WeTest分析使用)
  7. IT自学网有视频教程
  8. Java中String类intern()详解
  9. mysql order by 原理及优化详解
  10. 基于SDN的访问控制模块实现