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多线程编程(一):threading模块综述
Apr 05 Python
python中split方法用法分析
Apr 17 Python
Django的session中对于用户验证的支持
Jul 23 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
Python编程实现正则删除命令功能
Aug 30 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
python绘制BA无标度网络示例代码
Nov 21 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
Oct 21 Python
python实战之90行代码写个猜数字游戏
Apr 22 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
PHP取进制余数函数代码
2012/01/19 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
php实现zip文件解压操作
2015/11/03 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
2014年大学生四年规划书范文
2014/04/03 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
保险专业求职信
2014/07/07 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
javascript函数式编程基础
2021/09/15 Javascript
Django框架中视图的用法
2022/06/10 Python
JS实现简单九宫格抽奖
2022/06/28 Javascript