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函数式编程
Jun 09 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
用Python实现大文本文件切割的方法
Jan 12 Python
python爬虫实现中英翻译词典
Jun 25 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
python爬虫用mongodb的理由
Jul 28 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
pytorch中的model.eval()和BN层的使用
May 22 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新手上路(九)
2006/10/09 PHP
PHP 可阅读随机字符串代码
2010/05/26 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
python装饰器decorator介绍
2014/11/21 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
3分钟学会一个Python小技巧
2018/11/23 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
基于python实现复制文件并重命名
2020/09/16 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
教师队伍管理制度
2014/01/14 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
详解python的异常捕获
2022/03/03 Python