Python 使用模型/视图方法将信息从SQLite数据库映射到QComboBox
我处于上一节“从数据库映射信息”中描述的情况。代码是用C++编写的,我不能用Python来复制它。无论如何,我不熟悉这里介绍的概念,这让我更难理解。到目前为止,我所做的只是让组合框在“addresstype”表的“description”字段中显示信息,而不是像预期的那样在“person”表的“typeid”字段中显示信息。理想情况下,我希望通过根据模型/视图方法为ComboBox创建一个委托来解决此问题。首先,建议您使用更新的示例,因为有些内容可能不会保留。在这种情况下,官方的例子是Python 使用模型/视图方法将信息从SQLite数据库映射到QComboBox,python,pyqt5,Python,Pyqt5,我处于上一节“从数据库映射信息”中描述的情况。代码是用C++编写的,我不能用Python来复制它。无论如何,我不熟悉这里介绍的概念,这让我更难理解。到目前为止,我所做的只是让组合框在“addresstype”表的“description”字段中显示信息,而不是像预期的那样在“person”表的“typeid”字段中显示信息。理想情况下,我希望通过根据模型/视图方法为ComboBox创建一个委托来解决此问题。首先,建议您使用更新的示例,因为有些内容可能不会保留。在这种情况下,官方的例子是 在这个例
在这个例子中,也用C++表示,所以翻译是微不足道的:
from PyQt5 import QtWidgets, QtSql
class Window(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupModel()
self.nameLabel = QtWidgets.QLabel(self.tr("Na&me:"))
self.nameEdit = QtWidgets.QLineEdit()
self.addressLabel = QtWidgets.QLabel(self.tr("&Address:"))
self.addressEdit = QtWidgets.QTextEdit()
self.typeLabel = QtWidgets.QLabel(self.tr("&Type:"))
self.typeComboBox = QtWidgets.QComboBox()
self.nextButton = QtWidgets.QPushButton(self.tr("&Next"))
self.previousButton = QtWidgets.QPushButton(self.tr("&Previous"))
self.nameLabel.setBuddy(self.nameEdit)
self.addressLabel.setBuddy(self.addressEdit)
self.typeLabel.setBuddy(self.typeComboBox)
relModel = self.model.relationModel(self.typeIndex)
self.typeComboBox.setModel(relModel)
self.typeComboBox.setModelColumn(relModel.fieldIndex("description"))
self.mapper = QtWidgets.QDataWidgetMapper(self)
self.mapper.setModel(self.model)
self.mapper.setItemDelegate(QtSql.QSqlRelationalDelegate(self))
self.mapper.addMapping(self.nameEdit, self.model.fieldIndex("name"))
self.mapper.addMapping(self.addressEdit, self.model.fieldIndex("address"))
self.mapper.addMapping(self.typeComboBox, self.typeIndex)
self.previousButton.clicked.connect(self.mapper.toPrevious)
self.nextButton.clicked.connect(self.mapper.toNext)
self.mapper.currentIndexChanged.connect(self.updateButtons)
layout = QtWidgets.QGridLayout()
layout.addWidget(self.nameLabel, 0, 0, 1, 1)
layout.addWidget(self.nameEdit, 0, 1, 1, 1)
layout.addWidget(self.previousButton, 0, 2, 1, 1)
layout.addWidget(self.addressLabel, 1, 0, 1, 1)
layout.addWidget(self.addressEdit, 1, 1, 2, 1)
layout.addWidget(self.nextButton, 1, 2, 1, 1)
layout.addWidget(self.typeLabel, 3, 0, 1, 1)
layout.addWidget(self.typeComboBox, 3, 1, 1, 1)
self.setLayout(layout)
self.setWindowTitle(self.tr("SQL Widget Mapper"))
self.mapper.toFirst()
def setupModel(self):
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(":memory:")
if not db.open():
QtWidgets.QMessageBox.critical(
None,
self.tr("Cannot open database"),
self.tr(
"Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it."
),
QtWidgets.QMessageBox.Cancel,
)
return
query = QtSql.QSqlQuery()
query.exec(
"create table person (id int primary key, "
"name varchar(20), address varchar(200), typeid int)"
)
query.exec(
"insert into person values(1, 'Alice', "
"'<qt>123 Main Street<br/>Market Town</qt>', 101)"
)
query.exec(
"insert into person values(2, 'Bob', "
"'<qt>PO Box 32<br/>Mail Handling Service"
"<br/>Service City</qt>', 102)"
)
query.exec(
"insert into person values(3, 'Carol', "
"'<qt>The Lighthouse<br/>Remote Island</qt>', 103)"
)
query.exec(
"insert into person values(4, 'Donald', "
"'<qt>47338 Park Avenue<br/>Big City</qt>', 101)"
)
query.exec(
"insert into person values(5, 'Emma', "
"'<qt>Research Station<br/>Base Camp<br/>"
"Big Mountain</qt>', 103)"
)
query.exec("create table addresstype (id int, description varchar(20))")
query.exec("insert into addresstype values(101, 'Home')")
query.exec("insert into addresstype values(102, 'Work')")
query.exec("insert into addresstype values(103, 'Other')")
self.model = QtSql.QSqlRelationalTableModel(self)
self.model.setTable("person")
self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
self.typeIndex = self.model.fieldIndex("typeid")
self.model.setRelation(
self.typeIndex, QtSql.QSqlRelation("addresstype", "id", "description")
)
self.model.select()
def updateButtons(self, row):
self.previousButton.setEnabled(row > 0)
self.nextButton.setEnabled(row < self.model.rowCount() - 1)
def main():
import sys
app = QtWidgets.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
从PyQt5导入QtWidgets、QtSql
类窗口(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupModel()
self.namelab=qtwidts.QLabel(self.tr(“Na&me:”))
self.nameEdit=qtwidts.QLineEdit()
self.addressLabel=qtwidts.QLabel(self.tr(“&Address:”))
self.addressEdit=QtWidgets.QTextEdit()
self.typeLabel=qtwidts.QLabel(self.tr(“&Type:”))
self.typeComboBox=qtwidts.QComboBox()
self.nextButton=qtwidts.QPushButton(self.tr(“&Next”))
self.previousButton=qtwidts.QPushButton(self.tr(“&Previous”))
self.namelab.setBuddy(self.namedit)
self.addressLabel.setBuddy(self.addressEdit)
self.typeLabel.setBuddy(self.typeComboBox)
relModel=self.model.relationModel(self.typeIndex)
self.typeComboBox.setModel(relModel)
self.typeComboBox.setModelColumn(relModel.fieldIndex(“说明”))
self.mapper=QtWidgets.QDataWidgetMapper(self)
self.mapper.setModel(self.model)
self.mapper.setItemDelegate(QtSql.QSqlRelationalDelegate(self))
self.mapper.addMapping(self.nameEdit、self.model.fieldIndex(“name”))
self.mapper.addMapping(self.addressEdit、self.model.fieldIndex(“地址”))
self.mapper.addMapping(self.typeComboBox、self.typeIndex)
self.previousButton.clicked.connect(self.mapper.toPrevious)
self.nextButton.clicked.connect(self.mapper.toNext)
self.mapper.currentIndexChanged.connect(self.updateButtons)
layout=qtwidts.QGridLayout()
layout.addWidget(self.namelab,0,0,1,1)
layout.addWidget(self.namedit,0,1,1,1)
layout.addWidget(self.previousButton,0,2,1,1)
layout.addWidget(self.addressLabel,1,0,1,1)
layout.addWidget(self.addressEdit,1,1,2,1)
layout.addWidget(self.nextButton,1,2,1,1)
layout.addWidget(self.typeLabel,3,0,1,1)
layout.addWidget(self.typeComboBox,3,1,1,1)
self.setLayout(布局)
self.setWindowTitle(self.tr(“SQL小部件映射器”))
self.mapper.toFirst()
def设置模式(自):
db=QtSql.QSqlDatabase.addDatabase(“QSQLITE”)
db.setDatabaseName(“:内存:”)
如果不是db.open():
qtwidts.QMessageBox.critical(
没有一个
tr(“无法打开数据库”),
self.tr(
“无法建立数据库连接。\n”
“此示例需要SQLite支持。请阅读”
“Qt SQL驱动程序文档,了解如何使用”
“建造它。”
),
qtwidts.QMessageBox.Cancel,
)
返回
query=QtSql.QSqlQuery()
query.exec(
创建表person(id int主键)
名称varchar(20),地址varchar(200),类型ID int
)
query.exec(
“插入到个人值中(1,'Alice',”
“'123大街
集镇',101)”
)
query.exec(
“插入到个人值中(2,‘Bob’,”
“'32号邮政信箱
邮件处理服务”
“
服务城市”,102)”
)
query.exec(
“插入到个人值中(3,‘Carol’,”
“灯塔,
遥远的岛屿,103)”
)
query.exec(
“插入到个人值中(4,‘Donald’,”
“大城市公园大道47338号,101)”
)
query.exec(
“插入到个人值中(5,‘Emma’,”
“'研究站
大本营
”
“大山”,103)
)
exec(“创建表地址类型(id int,description varchar(20)))
exec(“插入地址类型值(101,'Home')”)
exec(“插入到addresstype值(102,'Work')”)
exec(“插入到addresstype值(103,'其他')”)
self.model=QtSql.QSqlRelationalTableModel(self)
自我模式可设置(“人”)
self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
self.typeIndex=self.model.fieldIndex(“typeid”)
self.model.setRelation(
self.typeIndex,QtSql.QSqlRelation(“addresstype”,“id”,“description”)
)
self.model.select()
def更新按钮(自身,行):
self.previousButton.setEnabled(行>0)
self.nextButton.setEnabled(行
非常感谢您!它工作得很好,现在我可以继续研究你的答案,并根据我的具体情况采纳它!