本文通过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 数据库编程--增删改实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!