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 相关文章推荐
Python3基础之输入和输出实例分析
Aug 18 Python
Python中的random()方法的使用介绍
May 15 Python
Python中的推导式使用详解
Jun 03 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python冲顶大会 快来答题!
Jan 17 Python
详解Django+Uwsgi+Nginx的生产环境部署
Jun 25 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
python实现微信自动回复及批量添加好友功能
Jul 03 Python
python装饰器代替set get方法实例
Dec 19 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
python爬虫scrapy基本使用超详细教程
Feb 20 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使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
几种响应式文字详解
2017/05/19 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python中内置的日志模块logging用法详解
2016/07/12 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python图形用户接口实例详解
2019/12/16 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
外企测试工程师面试题
2015/02/01 面试题
控制工程专业个人求职信
2013/09/25 职场文书
小学教师的自我评价范例
2013/10/31 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
元旦活动感言
2014/03/08 职场文书
法制报告会主持词
2014/04/02 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
2014年法院工作总结
2014/11/24 职场文书