Python 使用模型/视图方法将信息从SQLite数据库映射到QComboBox

Python 使用模型/视图方法将信息从SQLite数据库映射到QComboBox,python,pyqt5,Python,Pyqt5,我处于上一节“从数据库映射信息”中描述的情况。代码是用C++编写的,我不能用Python来复制它。无论如何,我不熟悉这里介绍的概念,这让我更难理解。到目前为止,我所做的只是让组合框在“addresstype”表的“description”字段中显示信息,而不是像预期的那样在“person”表的“typeid”字段中显示信息。理想情况下,我希望通过根据模型/视图方法为ComboBox创建一个委托来解决此问题。首先,建议您使用更新的示例,因为有些内容可能不会保留。在这种情况下,官方的例子是 在这个例

我处于上一节“从数据库映射信息”中描述的情况。代码是用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(行
非常感谢您!它工作得很好,现在我可以继续研究你的答案,并根据我的具体情况采纳它!