我有一个名为' room'的PostgreSQL父表。和一个名为'配置的相关表格。我有一个表单,允许用户添加编辑并将新配置添加到QTableView中的各个房间。在配置表中,room是房间表的外键。表格如下:
就编辑配置而言,似乎没有问题。当我在配置模型中添加新记录时出现问题。如果我插入一行而不设置房间单元格,则用户可以编辑任何字段并将其保存到数据库中。虽然,完成编辑后,行清除了!显示在行标题中。如果我重新加载表单,则记录正确。
但是,我想要做的是为用户设置房间号,并在配置视图中保留房间号字段对用户隐藏。当我添加一行并设置房间号码单元格的值时,我无法编辑该行。有什么想法吗?
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtSql import *
from rooms import *
from config import *
class Setup_rooms(QDialog):
def __init__(self):
QDialog.__init__(self)
self.ui = Ui_rooms_setup()
self.ui.setupUi(self)
self.rooms_model = QSqlRelationalTableModel(self)
self.rooms_model.setTable('rooms')
self.rooms_model.setRelation(4, QSqlRelation('room_types1', 'room_type', 'room_type'))
self.rooms_model.setSort(int(self.rooms_model.fieldIndex("room")), Qt.AscendingOrder)
self.rooms_model.select()
self.rooms_mapper = QDataWidgetMapper(self)
self.rooms_mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)
self.rooms_mapper.setModel(self.rooms_model)
self.rooms_mapper.setItemDelegate(QSqlRelationalDelegate(self))
self.rooms_mapper.addMapping(self.ui.room_num, self.rooms_model.fieldIndex("room"))
self.rooms_mapper.addMapping(self.ui.room_description, self.rooms_model.fieldIndex("description"))
self.rooms_mapper.addMapping(self.ui.deep_clean_date, self.rooms_model.fieldIndex("deepcleandate"))
self.rooms_mapper.addMapping(self.ui.deep_clean_cycle, self.rooms_model.fieldIndex("deepcleancycle"))
room_types_model = self.rooms_model.relationModel(4)
self.ui.room_type.setModel(room_types_model)
self.ui.room_type.setModelColumn(room_types_model.fieldIndex('room_type'))
self.rooms_mapper.addMapping(self.ui.room_type, self.rooms_model.fieldIndex('room_type'))
self.rooms_mapper.toFirst()
self.ui.current_index.setText(str(self.rooms_mapper.currentIndex()))
self.config_model = QSqlRelationalTableModel(self)
self.config_model.setTable('room_configurations')
self.config_model.setRelation(self.config_model.fieldIndex("configuration"), QSqlRelation('configurations', 'configuration', 'configuration'))
self.room_model = self.config_model.relationModel(self.config_model.fieldIndex('room'))
self.config_view = self.ui.configurations
self.config_view.setModel(self.config_model)
self.config_view.horizontalHeader().setStretchLastSection(True)
self.config_model.select()
self.config_model.setHeaderData(self.config_model.fieldIndex("sort_order"), Qt.Horizontal, "sort order")
self.config_view.setItemDelegate(View_room_config(self))
self.config_view.setItemDelegate(QSqlRelationalDelegate(self.config_view))
self.config_view.resizeColumnsToContents()
room = self.rooms_model.record(self.rooms_mapper.currentIndex()).value('room')
self.config_model.setFilter("room = '{0}'".format(room))
#self.config_view.setColumnHidden(0, True)
#self.config_view.setColumnHidden(2, True)
self.ui.add_config.clicked.connect(self.add_config)
def add_config(self):
row=int(self.config_model.rowCount())
self.config_model.insertRow(row)
self.index = QModelIndex(self.config_model.index(row, 2))
self.config_model.setData(self.index, self.ui.room_num.text(), Qt.EditRole)
class View_room_config(QSqlRelationalDelegate):
def __init__(self, parent=None):
QItemDelegate.__init__(self)
def createEditor(self, parent, option, index):
if index.column() == 3:
combo = super().createEditor(parent, option, index)
if __name__=="__main__":
app=QApplication(sys.argv)
db = QSqlDatabase.addDatabase("QPSQL")
db.setHostName(host)
db.setDatabaseName(database)
db.setUserName(user)
db.setPassword(password)
if (db.open()==False):
QMessageBox.critical(None, "Database Error", db.lastError().text())
myapp = Setup_rooms()
myapp.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
我解决了我的问题。我将数据库的备份恢复到开发区域。我不知道会导致问题的任何基础表,但我的理论是发生了数据库错误。我现在正在使用self.config_model.lastError()。text()测试self.config_model上的错误,但我还没有找到任何错误。
尽管如此,在不改变我的代码的情况下,程序仍然有效,尽管编辑时的用户界面相当笨重。我现在将研究它。