在 QTableView 中插入行

Posted

技术标签:

【中文标题】在 QTableView 中插入行【英文标题】:Inserting row in QTableView 【发布时间】:2018-05-15 07:26:27 【问题描述】:

我有一个名为“rooms”的 PostgreSQL 父表和一个名为“configurations”的相关表。我有一个表单,它允许用户在 QTableView 中向各个房间添加编辑和新配置。在配置表中,房间是房间表的外键。表单如下所示:

就编辑配置而言,似乎没有问题。当我在配置模型中添加新记录时出现问题。如果我插入一行并且不设置房间单元格,用户可以编辑任何字段并将其保存到数据库中。虽然,在完成编辑后,该行会清除并且!显示在行标题中。如果我重新加载表单,则记录已正确编辑。

但是,我想做的是为用户设置房间号,并在配置视图中对用户隐藏房间号字段。当我添加一行并设置房间号单元格的值时,我无法编辑该行。有什么想法吗?

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_())

【问题讨论】:

【参考方案1】:

我对我的问题进行了排序。我将数据库的备份恢复到开发区。我不知道任何会导致问题的基础表,但我的理论是发生了数据库错误。我现在正在使用 self.config_model.lastError().text() 测试 self.config_model 上的错误,但我没有找到任何错误。

尽管如此,在不更改我的代码的情况下,尽管编辑时的用户界面相当笨拙,但程序还是可以工作的。我现在会调查一下。

【讨论】:

以上是关于在 QTableView 中插入行的主要内容,如果未能解决你的问题,请参考以下文章

模型在 QTableView 中动态插入和删除行时的信号/插槽

PyQt:如何在 QTableView 中的光标处插入文本

更改 QTableView 中的默认行大小

来自模型的数据未插入 QTableView

Python QTableView:如何在列中插入项目

如何在 QTableView 中应用过滤器后显示特定行