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 中split 和 strip的实例详解
Jul 12 Python
python使用Apriori算法进行关联性解析
Dec 21 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
用python打印菱形的实操方法和代码
Jun 25 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
wxpython多线程防假死与线程间传递消息实例详解
Dec 13 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
Jan 13 Python
Python函数生成器原理及使用详解
Mar 12 Python
python 获取字典键值对的实现
Nov 12 Python
如何理解python接口自动化之logging日志模块
Jun 15 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下载远程文件类(支持断点续传)
2008/11/14 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php+mysql数据库查询实例
2015/01/21 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
微信支付开发告警通知实例
2016/07/12 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
介绍Python的@property装饰器的用法
2015/04/28 Python
django 常用orm操作详解
2017/09/13 Python
Python使用functools实现注解同步方法
2018/02/06 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
python实现大文本文件分割
2019/07/22 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
电脑销售顾问自荐信
2014/01/29 职场文书
对孩子的寄语
2014/04/09 职场文书
工会积极分子个人总结
2015/03/03 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书