如何将 QSqlTableModel 设为只读?

问题描述 投票:0回答:1

我正在使用 PySide6 制作一个程序,它将从 MainWindow 添加注释到 Journal(其中有一个 QSqlTableModel),一切正常,但我无法使 Journal 中的表格不可编辑(直到您单击“只读” “复选框)。我读了很多东西,但仍然无法理解。谢谢你的帮助

class RolphSecurityService(QMainWindow):
    def __init__(self):
        super(RolphSecurityService, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.conn = Database()
        self.ui.open_journal_btn.clicked.connect(self.open_journal)
        self.ui.do_note.clicked.connect(self.collect_data)
        
    
    def open_journal(self):
        self.jour = Journal()
        self.jour.show()


class Journal(QtWidgets.QDialog):
    def __init__(self):
        super(Journal, self).__init__()
        self.ui = Ui_Journal()
        self.ui.setupUi(self)
        Database()
        self.db = Database()
        self.view_data()
        self.ui.update_list_btn.clicked.connect(self.view_data)
        self.ui.delete_btn.clicked.connect(self.delete_note)
        self.read_only()
        

    def read_only(self):
        ... # I want the func to be here
        
    def view_data(self):

        header_data = [
            '№', 'Имя менеджера', 'Дата запроса', 'Дата обработки',
            'Марка машины', 'Модель машины', 'Цвет машины', 'VIN',
            'СТС', 'Год выпуска', 'Номер ГН', 'Регион ГН',
            'Имя собственника', 'Дата рождения собственника', 'Паспорт собственника', 'ИНН собственника',
            'Владеет с', 'По', 'Номер предоставленный собственника', 'Номер установленный собственника',
            'Чем вызвана сложность'
            ]
        
        header_ranges = range(21)

        self.model = QSqlTableModel(self)
        self.model.setTable('Journal')
        self.model.select()


        for x, y in zip(header_data, header_ranges):
            self.model.setHeaderData(y, QtCore.Qt.Orientation.Horizontal, x)

        self.ui.tableView.setModel(self.model)
        self.ui.tableView.resizeColumnsToContents()
        self.ui.tableView.sortByColumn(0, QtCore.Qt.SortOrder.DescendingOrder)

        x = self.db.get_amount_note()
        self.ui.amount_of_notes.setText(str(x))

    

    def delete_note(self):

        selected = self.ui.tableView.selectedIndexes()

        rows = set(index.row() for index in selected)
        rows = list(rows)
        rows.sort()
        first = rows[0]

        self.model.removeRow(first)
        self.model.select()

我尝试使用 SetEditStrategy 和 ItemEnabled,但没有按计划工作

python sql pyside qsqltablemodel
1个回答
0
投票

您可以在视图上使用EditTriggers
要禁用编辑:

self.ui.tableView.setEditTriggers(QTableView.EditTriggers.NoEditTriggers)

启用:

self.ui.tableView.setEditTriggers(QTableView.EditTriggers.DoubleClicked | QTableView.EditTriggers.SelectedClicked)

或者不同的触发器组合。

或者,您可以子类化

QSqlTableModel
并重新实现 flags() 您可以通过不在其返回的
ItemFlag
中包含 ItemIsEditable 来使模型只读。

© www.soinside.com 2019 - 2024. All rights reserved.