问题描述
我到处寻找,但找不到解决问题的方法。我想要做的就是通过表单将新记录插入数据库,如果记录成功插入[行编辑中的有效条目] 清除表单;否则抛出错误。下面请看一个最小的代码。为了给出一些上下文,表中的“状态”字段具有仅接受 2 个字符 [状态缩写] 的约束。在插入方法中,if-else 语句导致以下行为。如果我插入有效记录,[John,NY] 记录插入成功;然而 QMessageBox 也出现在屏幕上,但它没有显示任何错误。此外,表单(行编辑)不会被清除。如果我尝试插入无效记录 [John,New York],QMessageBox 会出现检查违规错误,并且行编辑中的条目保留在那里;但是,当我更正状态条目(将纽约更改为纽约)并再次点击按钮时,我仍然在屏幕上收到相同的错误消息,但在后台记录被插入到表中;表格也没有被清除。 然后我尝试使用 try-except-else 块,但这也不起作用。在有效条目的情况下,它工作正常。但是,如果我在状态行中输入无效值,则不会出现编辑 QMessageBox;表格也被清除了。不知道我做错了什么。
import sys
from PyQt5 import QtWidgets as qtw
import PyQt5.Qtsql as qpsql
class MainWindow(qtw.QMainWindow):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.layout = qtw.QVBoxLayout()
self.first_name_line_edit = qtw.QLineEdit('first_name')
self.state_line_edit = qtw.QLineEdit('state')
self.layout.addWidget(self.first_name_line_edit)
self.layout.addWidget(self.state_line_edit)
self.insert_button = qtw.QPushButton('Insert')
self.insert_button.clicked.connect(self.insert)
self.layout.addWidget(self.insert_button)
self.model = qpsql.QsqlTableModel(db = db_)
self.table = qtw.QTableView()
self.table.setModel(self.model)
self.mapper = qtw.QDataWidgetMapper()
self.mapper.setModel(self.model)
self.mapper.setSubmitPolicy(qtw.QDataWidgetMapper.ManualSubmit)
self.model.setTable('table')
self.mapper.addMapping(self.first_name_line_edit,self.model.fieldindex('first_name'))
self.mapper.addMapping(self.state_line_edit,self.model.fieldindex('state'))
self.model.select()
self.layout.addWidget(self.table)
self.widget = qtw.QWidget()
self.widget.setLayout(self.layout)
self.setCentralWidget(self.widget)
def clear_(self):
self.first_name_line_edit.clear()
self.state_line_edit.clear()
def insert(self):
record = self.model.record()
record.setValue('first_name',self.first_name_line_edit.text())
record.setValue('state',self.state_line_edit.text())
# 1. Record gets inserted;QMessageBox pops up without any error printed; Line edits don't clear.
if self.model.insertRecord(-1,record):
self.model.submitAll()
self.clear_()
else:
qtw.QMessageBox.critical(None,"Error",self.model.lastError().text())
# 2. QMessageBox doesn't appear; Line Edits get clear;
# try:
# self.model.insertRecord(-1,record)
# self.model.submitAll()
# except Exception:
# qtw.QMessageBox.critical(None,self.model.lastError().text())
# else:
# self.clear_()
if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)