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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
理论讲解python多进程并发编程
Feb 09 Python
详解python的argpare和click模块小结
Mar 31 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Django应用程序入口WSGIHandler源码解析
Aug 05 Python
Python装饰器的应用场景代码总结
Apr 10 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
numpy中生成随机数的几种常用函数(小结)
Aug 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
详解Python IO编程
2020/07/24 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
最新教师自我评价分享
2013/11/12 职场文书
致百米运动员广播稿
2014/01/29 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
公司安全管理制度范本
2015/08/05 职场文书
早安问候语大全
2015/11/10 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android