python3+PyQt5 数据库编程--增删改实例


Posted in Python onJune 17, 2019

本文通过python3+pyqt5改写实现了python Qt gui 编程变成15章的excise例子。

#!/usr/bin/env python3
import os
import sys
from PyQt5.QtCore import (QFile, QVariant, Qt)
from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QMenu,
    QMessageBox, QTableView, QVBoxLayout)
from PyQt5.QtSql import (QSqlDatabase, QSqlQuery, QSqlTableModel)

MAC = True
try:
  from PyQt5.QtGui import qt_mac_set_native_menubar
except ImportError:
  MAC = False

ID, CATEGORY, SHORTDESC, LONGDESC = range(4)


class ReferenceDataDlg(QDialog):

  def __init__(self, parent=None):
    super(ReferenceDataDlg, self).__init__(parent)

    self.model = QSqlTableModel(self)
    self.model.setTable("reference")
    self.model.setSort(ID, Qt.AscendingOrder)
    self.model.setHeaderData(ID, Qt.Horizontal, "ID")
    self.model.setHeaderData(CATEGORY, Qt.Horizontal,"Category")
    self.model.setHeaderData(SHORTDESC, Qt.Horizontal,"Short Desc.")
    self.model.setHeaderData(LONGDESC, Qt.Horizontal,"Long Desc.")
    self.model.select()

    self.view = QTableView()
    self.view.setModel(self.model)
    self.view.setSelectionMode(QTableView.SingleSelection)
    self.view.setSelectionBehavior(QTableView.SelectRows)
    self.view.setColumnHidden(ID, True)
    self.view.resizeColumnsToContents()

    buttonBox = QDialogButtonBox()
    addButton = buttonBox.addButton("&Add",
        QDialogButtonBox.ActionRole)
    deleteButton = buttonBox.addButton("&Delete",
        QDialogButtonBox.ActionRole)
    sortButton = buttonBox.addButton("&Sort",
        QDialogButtonBox.ActionRole)
    if not MAC:
      addButton.setFocusPolicy(Qt.NoFocus)
      deleteButton.setFocusPolicy(Qt.NoFocus)
      sortButton.setFocusPolicy(Qt.NoFocus)

    menu = QMenu(self)
    sortByCategoryAction = menu.addAction("Sort by &Category")
    sortByDescriptionAction = menu.addAction("Sort by &Description")
    sortByIDAction = menu.addAction("Sort by &ID")
    sortButton.setMenu(menu)
    closeButton = buttonBox.addButton(QDialogButtonBox.Close)

    layout = QVBoxLayout()
    layout.addWidget(self.view)
    layout.addWidget(buttonBox)
    self.setLayout(layout)

    addButton.clicked.connect(self.addRecord)
    deleteButton.clicked.connect(self.deleteRecord)
    sortByCategoryAction.triggered.connect(lambda:self.sort(CATEGORY))
    sortByDescriptionAction.triggered.connect(lambda:self.sort(SHORTDESC))
    sortByIDAction.triggered.connect(lambda:self.sort(ID))
    closeButton.clicked.connect(self.accept)
    self.setWindowTitle("Reference Data")


  def addRecord(self):
    row = self.model.rowCount()
    self.model.insertRow(row)
    index = self.model.index(row, CATEGORY)
    self.view.setCurrentIndex(index)
    self.view.edit(index)


  def deleteRecord(self):
    index = self.view.currentIndex()
    if not index.isValid():
      return
    record = self.model.record(index.row())
    category = record.value(CATEGORY)
    desc = record.value(SHORTDESC)
    if (QMessageBox.question(self, "Reference Data",
        ("Delete {0} from category {1}?"
        .format(desc,category)),
        QMessageBox.Yes|QMessageBox.No) ==
        QMessageBox.No):
      return
    self.model.removeRow(index.row())
    self.model.submitAll()
    self.model.select()


  def sort(self, column):
    self.model.setSort(column, Qt.AscendingOrder)
    self.model.select()


def main():
  app = QApplication(sys.argv)

  filename = os.path.join(os.path.dirname(__file__), "reference.db")
  create = not QFile.exists(filename)

  db = QSqlDatabase.addDatabase("QSQLITE")
  db.setDatabaseName(filename)
  if not db.open():
    QMessageBox.warning(None, "Reference Data",
      "Database Error: {0}".format(db.lastError().text()))
    sys.exit(1)

  if create:
    query = QSqlQuery()
    query.exec_("""CREATE TABLE reference (
        id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
        category VARCHAR(30) NOT NULL,
        shortdesc VARCHAR(20) NOT NULL,
        longdesc VARCHAR(80))""")

  form = ReferenceDataDlg()
  form.show()
  sys.exit(app.exec_())

main()

运行结果:

python3+PyQt5 数据库编程--增删改实例

以上这篇python3+PyQt5 数据库编程--增删改实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
Django 前后台的数据传递的方法
Aug 08 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
python async with和async for的使用
Jun 20 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
python中使用asyncio实现异步IO实例分析
Feb 26 Python
用Python可视化新冠疫情数据
Jan 18 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 #Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 #Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 #Python
对PyQt5中树结构的实现方法详解
Jun 17 #Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 #Python
使用python接入微信聊天机器人
Mar 31 #Python
基于树莓派的语音对话机器人
Jun 17 #Python
You might like
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP 操作文件的一些FAQ总结
2009/02/12 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
详解PHP归并排序的实现
2016/10/18 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
javascript中如何判断类型汇总
2019/05/14 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
pandas分组聚合详解
2020/04/10 Python
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
kfc实习自我鉴定
2013/12/14 职场文书
留守儿童工作方案
2014/06/02 职场文书
模具专业求职信
2014/06/26 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
2014年工商所工作总结
2014/12/09 职场文书
2015年资料员工作总结
2015/04/25 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android