Python 设置了两个带有QStyledItemDelegate的验证器后,QtableView立即崩溃

Python 设置了两个带有QStyledItemDelegate的验证器后,QtableView立即崩溃,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,基于这个问题的答案,我更进一步,基于QStyledItemDelegate创建了两个单独的验证器,一个用于整数,一个用于双精度 如果每一个验证器都是唯一的一组,那么它就可以完美地工作。一旦我尝试设置两个验证器(每个都在其各自的列中),整个应用程序就会崩溃 import sys from PyQt5.QtCore import QSize, Qt, pyqtSignal, QObject from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, Q

基于这个问题的答案,我更进一步,基于QStyledItemDelegate创建了两个单独的验证器,一个用于整数,一个用于双精度

如果每一个验证器都是唯一的一组,那么它就可以完美地工作。一旦我尝试设置两个验证器(每个都在其各自的列中),整个应用程序就会崩溃

import sys
from PyQt5.QtCore import QSize, Qt, pyqtSignal, QObject
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QMessageBox,\
    QLineEdit, QWidget, QVBoxLayout, QDataWidgetMapper, QPushButton, QStyledItemDelegate
from PyQt5.QtGui import QIntValidator, QDoubleValidator

class ValidatedIntItemDelegate(QStyledItemDelegate):
    def __init__(self, bottom, top):
        QStyledItemDelegate.__init__(self)
        self.bottom = bottom
        self.top = top
    
    def createEditor(self, widget, option, index):
        editor = QLineEdit(widget)
        validator = QIntValidator(self.bottom, self.top)
        editor.setValidator(validator)
        return editor 

class ValidatedDoubleItemDelegate(QStyledItemDelegate):
    def __init__(self, bottom, top, decimals=0):
        QStyledItemDelegate.__init__(self)
        self.bottom = bottom
        self.top = top
        self.decimals = decimals
    
    def createEditor(self, widget, option, index):
        editor = QLineEdit(widget)
        validator =  QDoubleValidator(self.bottom, self.top, self.decimals)
        editor.setValidator(validator)
        return editor

class SqlModel(QSqlTableModel):
    def __init__(self, parent=None):
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("chinook.sqlite")
        self.db.open()
        super().__init__()
        self.setupTable()
        self.setTable("Track")
        self.setSort(1, Qt.AscendingOrder)
        self.select()
        self.setEditStrategy(QSqlTableModel.OnFieldChange)
    
    def setupTable(self):
        query = QSqlQuery()
        query.exec("DROP TABLE if exists Track;")
        query.exec("create table if not exists Track ("
                "doda Text,"
                "One Text,"
                "Two Text,"
                "Three Text);")
        query.exec("INSERT into Track (doda) Values( '1' );")
        query.exec("INSERT into Track (doda) Values( '2' );")
        query.exec("INSERT into Track (doda) Values( '3' );")

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setMinimumSize(QSize(450, 200))
        widget = QWidget()        
        layout = QVBoxLayout()
        widget.setLayout(layout)
        self.setCentralWidget(widget)
        self.table = QTableView()
        layout.addWidget(self.table)
        self.model = SqlModel()
        self.table.setModel( self.model )

        intDelegate = ValidatedIntItemDelegate(1, 99)
        self.table.setItemDelegateForColumn(0, intDelegate)
#         doubleDelegate = ValidatedDoubleItemDelegate(1,99,2)
#         self.table.setItemDelegateForColumn(1, doubleDelegate)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

有人知道如何让两个验证器并行工作吗?

问题似乎是因为视图没有获得代理的所有权,然后从内存中删除代理,因为它们是导致分段错误的局部变量。解决方案是通过创建类属性来延长其生命周期:

self.intDelegate = ValidatedIntItemDelegate(1, 99)
self.table.setItemDelegateForColumn(0, self.intDelegate)
self.doubleDelegate = ValidatedDoubleItemDelegate(1, 99, 2)
self.table.setItemDelegateForColumn(1, self.doubleDelegate)
self.intDelegate=validatedinitemdelegate(1,99)
self.table.setItemDelegateForColumn(0,self.intDelegate)
self.doubleDelegate=ValidatedDoubleItemDelegate(1,99,2)

self.table.setItemDelegateForColumn(1,self.doubleDelegate)
棒极了!非常感谢。