【问题标题】:Fixing Add Row function in QTableView in PyQt5修复 PyQt5 中 QTableView 中的 Add Row 函数
【发布时间】:2019-03-25 08:33:37
【问题描述】:

这是我从数据库中获取数据并使用 PyQt5 创建表视图的代码。基本上,我将它导入另一个文件并通过按钮调用它。输出正在获取我的数据库并以正确的表格格式显示它。它正在正确更新。删除功能也正常工作。但是添加功能不起作用,导致应用崩溃。

import sys
from PyQt5 import QtSql, QtCore
from PyQt5.QtWidgets import *

class crud():

    def initializeModel(self,model):
        self.model.setTable('student')
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
        self.model.select()
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Roll No")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Name")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Father Name")
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Email")
        self.model.setHeaderData(4, QtCore.Qt.Horizontal, "Mobile")
        self.model.setHeaderData(5, QtCore.Qt.Horizontal, "Department")
        self.model.setHeaderData(6, QtCore.Qt.Horizontal, "Section")
        self.model.setHeaderData(7, QtCore.Qt.Horizontal, "Password")

    def createView(self,model):
        self.view=QTableView()
        self.view.setToolTip("Change the fields")
        self.view.setModel(model)
        return self.view

    def addrow(self,model):
        print(model.rowcount())
        ret=(model.insertRows(model.rowcount(),1))
        print(ret)

    def findrow(self,i):
        delrow=i.row()
        print(delrow)

    def datastudent(self):
        self.db=QtSql.QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('atdata.db')
        self.model=QtSql.QSqlTableModel()
        delrow=-1
        self.initializeModel(self.model)

        self.View1=self.createView("Table Model",self.model)
        self.View1.clicked.connect(self.findrow)

        self.dlg=QDialog()
        self.layout=QVBoxLayout()
        self.layout.addWidget(self.View1)

        self.button=QPushButton("Add a row")
        self.button.clicked.connect(self.addrow)
        self.layout.addWidget(self.button)

        self.btn1=QPushButton("Delete a Row")
        self.btn1.clicked.connect(lambda :self.model.removeRow(self.View1.currentIndex().row()))
        self.layout.addWidget(self.btn1)

        self.dlg.setLayout(self.layout)
        self.dlg.setWindowTitle("My Database")
        self.dlg.setGeometry(100, 100, 1100, 600)
        self.dlg.exec_()

这是添加功能的代码,我在其中遇到问题。定义此函数是为了在数据库中添加一个新行以插入数据。

 def addrow(self,model):
        print(model.rowcount())
        ret=(model.insertRows(model.rowcount(),1))
        print(ret)

注意:- 此代码工作正常,但在我在类中定义它之前,因为我想导入它。我的原始代码是here,请查看以供参考。 请帮忙。提前谢谢你。

【问题讨论】:

  • 分享你的 atdata.db
  • 这是我的数据库链接link@eyllanesc
  • 你就说你有问题,有什么问题?
  • 如何使用 crud 类的对象?
  • Windows 在调用 addrow 函数时崩溃。

标签: python python-3.x pyqt pyqt5


【解决方案1】:

将一组函数和语句修改为一个类的想法并非易事,其中一个主要问题是由于避免了方法内变量的范围,这可能会导致问题,例如单击button 没有传递任何参数,所以 addrow 的 model 参数不存在,它会抛出这个错误,你肯定认为 self.model 与 model 相同,但事实并非如此。

所以我冒昧地将该类转换为自定义 QDialog:

import sys
from PyQt5 import QtCore, QtWidgets, QtSql 


class CrudDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(CrudDialog, self).__init__(parent)

        db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName('atdata.db')

        self.view = QtWidgets.QTableView()
        self.view.setToolTip("Change the fields")
        self.view.setWindowTitle("Table Model")

        btn_add = QtWidgets.QPushButton("Add a row")
        btn_add.clicked.connect(self.add_row)

        btn_del = QtWidgets.QPushButton("Delete a row")
        btn_del.clicked.connect(self.remove_row)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.view)
        lay.addWidget(btn_add)
        lay.addWidget(btn_del)

        self.model = QtSql.QSqlTableModel()
        self.model.setTable('student')
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
        self.model.select()
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Roll No")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Name")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Father Name")
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Email")
        self.model.setHeaderData(4, QtCore.Qt.Horizontal, "Mobile")
        self.model.setHeaderData(5, QtCore.Qt.Horizontal, "Department")
        self.model.setHeaderData(6, QtCore.Qt.Horizontal, "Section")
        self.model.setHeaderData(7, QtCore.Qt.Horizontal, "Password")
        self.view.setModel(self.model)

        self.resize(1100, 600)

    @QtCore.pyqtSlot()
    def add_row(self):
        self.model.insertRows(self.model.rowCount(), 1)

    @QtCore.pyqtSlot()
    def remove_row(self):
        self.model.removeRow(self.view.currentIndex().row())
        self.model.select()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    button = QtWidgets.QPushButton("Show")
    c = CrudDialog()
    button.clicked.connect(c.exec_)
    button.show()
    sys.exit(app.exec_())

而且你不应该再调用 datastudent 而是调用 exec_:

self.crud_dialog = CrudDialog()
some_button.clicked.connect(self.crud_dialog.exec_)

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2019-04-10
    • 1970-01-01
    • 2020-09-21
    • 2014-10-16
    • 2015-04-23
    • 2014-03-09
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多