art*_*ter 4 python qt pyqt qabstractlistmodel pyqt5
我一直在关注一些教程并尝试设置列表模型.我的主窗口有两个访问相同模型的列表视图.当我更新一个列表中的项目时,另一个列表不会更新自己,直到它获得焦点(我点击它).所以看起来似乎没有发出dataChanged信号,但我无法弄清楚我的代码是如何与我所基于的任何示例不同的.
main.py
class Main(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.ui = uic.loadUi("mainwindow.ui", self)
# Test model and listviews
data = [10,20,30,40,50]
myModel = model.MyListModel(data)
self.ui.listView.setModel(myModel)
self.ui.listView_2.setModel(myModel)
Run Code Online (Sandbox Code Playgroud)
model.py
class MyListModel(QtCore.QAbstractListModel):
def __init__(self, data=[], parent=None):
super(MyListModel, self).__init__(parent)
self.__data = data
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.__data)
def data(self, index, role=QtCore.Qt.DisplayRole):
row = index.row()
if role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole):
return str(self.__data[row])
if role == QtCore.Qt.ToolTipRole:
return 'Item at {0}'.format(row)
def flags(self, index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
def setData(self, index, value, role=QtCore.Qt.EditRole):
if role == QtCore.Qt.EditRole:
self.__data[index.row()] = value
self.dataChanged.emit(index, index)
return True
return False
Run Code Online (Sandbox Code Playgroud)
谁能看到这里有什么问题?仅供参考我正在使用PyQT5.2.1和Python 3.3.
问题在于dataChanged信号的签名.在Qt4中它看起来像这样:
dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight)
Run Code Online (Sandbox Code Playgroud)
但在Qt5中,它看起来像这样:
dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight,
const QVector<int> & roles = QVector<int>())
Run Code Online (Sandbox Code Playgroud)
当我用PyQt-5.1.1尝试你的示例代码时,我在尝试发出没有第三个参数的信号时出错.严格来说,这是不正确的行为,因为第三个参数有一个默认值.所以这也许是行为改变的原因.
但似乎你现在必须显式地发出一个空列表作为第三个参数,dataChanged以便在PyQt5中正常工作:
self.dataChanged.emit(index, index, [])
Run Code Online (Sandbox Code Playgroud)
或者,当然,发出实际已更改的角色列表:
self.dataChanged.emit(index, index, [QtCore.Qt.EditRole])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6054 次 |
| 最近记录: |