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 相关文章推荐
PyQt5利用QPainter绘制各种图形的实例
Oct 19 Python
python交互式图形编程实例(一)
Nov 17 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
python flask框架实现重定向功能示例
Jul 02 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
Nov 15 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
python 多进程队列数据处理详解
Dec 23 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
解决python运行启动报错问题
Jun 01 Python
Python通用唯一标识符uuid模块使用案例
Sep 10 Python
python中判断数字是否为质数的实例讲解
Dec 06 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/04/09 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
分享20个提升网站界面体验的jQuery插件
2014/12/15 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
ionic2.0双击返回键退出应用
2019/09/17 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
在Django框架中运行Python应用全攻略
2015/07/17 Python
Python探索之修改Python搜索路径
2017/10/25 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
Python多进程fork()函数详解
2019/02/22 Python
python如何导入依赖包
2020/07/13 Python
Python实现弹球小游戏
2020/08/01 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
高校生生产实习自我鉴定
2013/09/21 职场文书
美术教师岗位职责
2014/03/18 职场文书
品牌推广策划方案
2014/05/28 职场文书
岗位工作说明书
2014/07/29 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
Spring Boot 实现 WebSocket
2022/04/30 Java/Android