如何在PyQt5中发出dataChanged信号

7
下面的代码在self.emit这一行出错。在PyQt4中运行良好。如何修改代码使其在PyQt5中正常工作?
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSignal

class ItemDelegate(QtWidgets.QItemDelegate):
    def __init__(self, parent):
        QtWidgets.QItemDelegate.__init__(self, parent)

    def createEditor(self, parent, option, index):
        return QtWidgets.QLineEdit()

    @QtCore.pyqtSlot()
    def setModelData(self, editor, model, index): 
        self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index)  

稍后编辑:

一个可行的解决方案:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSignal

class Communicate(QObject):
    data_changed = pyqtSignal(QtCore.QModelIndex, QtCore.QModelIndex)

class ItemDelegate(QtWidgets.QItemDelegate):
    def __init__(self, parent):
        QtWidgets.QItemDelegate.__init__(self, parent)
        self.c = Communicate()

    @QtCore.pyqtSlot()
    def setModelData(self, editor, model, index):
        self.c.data_changed.emit(index, index)

pyqtSlot 装饰器也应该给出类型参数以反映 setModelData 的参数。旧版本的 PyQt5 将会建立连接,但 PyQt 5.6 现在强制执行此规定 - user3419537
2个回答

3
如您在 这里所读到的,QtCore.SIGNAL 已于 PyQt4 后被停用,因此不再兼容。 该页面介绍了 PyQt5 的新型信号和槽。其语法为:
PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]])

您的情况可以翻译成:
from PyQt5 import pyqtsignal

data_changed = pyqtsignal(QModelindex,QModelIndex)

并发射您的信号:

self.data_changed.emit(index, index)

编辑:以下解决方案来自下面的评论。


data_changed = pyqtSignal(index, index, name="dataChanged(QModelindex,QModelIndex)")上出现了TypeError: string or ASCII unicode expected not 'QModelIndex'错误。 - alphanumeric
1
pyqtSignal 构造函数的类型参数应为数据类型,而不是单个实例,例如 data_changed = pyqtSignal(QModelIndex, QModelIndex)。当发出信号时,应传递 index,即 self.data_changed.emit(index, index) - user3419537
用户3419537:糟糕,我会相应地编辑解决方案。 - Ian

2
回复内容存在敏感词^**$ in PyQt5:

self.dataChanged.emit(index, index, [QtCore.Qt.EditRole])

我原本以为这个信号是由框架发出的,用户只是订阅它。没意识到用户需要自己生成它! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接