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 常用的安装Module方式汇总
May 06 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
Python shelve模块实现解析
Aug 28 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
使用npy转image图像并保存的实例
Jul 01 Python
python 如何实现遗传算法
Sep 22 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
Python实现的扫码工具居然这么好用!
Jun 07 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 session 预定义数组
2009/03/16 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现文件分组复制到不同目录的例子
2014/06/04 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
python数据化运营的重要意义
2019/11/25 Python
keras.layer.input()用法说明
2020/06/16 Python
python批量修改文件名的示例
2020/09/27 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
什么是封装
2013/03/26 面试题
夜不归宿检讨书
2014/02/25 职场文书
我的中国梦口号
2014/06/16 职场文书
租房安全协议书
2014/08/20 职场文书
文明旅游倡议书
2015/04/28 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript