[英]Error from QTableView selectionChanged
If I try to get the signal when my tableview changes, Python raises this error: 如果尝试更改表视图时发出信号,Python会引发此错误:
Traceback (most recent call last):
File "UIreadresultwindow.py", line 361, in <module>
ui.setupUi(ReadResultWindow)
File "UIreadresultwindow.py", line 113, in setupUi
self.tableEntity.selectionModel().selectionChanged.connect(self.change
_display_result)
AttributeError: 'NoneType' object has no attribute 'selectionChanged'
I define tableEntity as: 我将tableEntity定义为:
self.tableEntity = QtWidgets.QTableView(self.centralWidget)
Edit : At first my QTableView is empty. 编辑 :起初我的QTableView是空的。 I have to open a file to fill it.
我必须打开一个文件来填充它。
Edit2 : To be more specific, I have something like this: Edit2 :更具体地说,我有这样的东西:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_ReadResultWindow(object):
def setupUi(self, ReadResultWindow):
ReadResultWindow.setObjectName("ReadResultWindow")
ReadResultWindow.resize(661, 438)
self.centralWidget = QtWidgets.QWidget(ReadResultWindow)
self.centralWidget.setObjectName("centralWidget")
self.tableEntity = QtWidgets.QTableView(self.centralWidget)
self.tableEntity.setObjectName("tableEntity")
self.Open = QtWidgets.QPushButton(self.centralWidget)
self.Open.setObjectName("Open")
self.Open.clicked.connect(self.on_open_file)
self.tableEntity.selectionModel().selectionChanged.connect(self.change_display_result)
def on_open_file(self):
x=[1,2,3,4]
self.model= QtGui.QStandardItemModel()
for item in x:
self.model.invisibleRootItem().appendRow(
QtGui.QStandardItem(str(x)))
self.proxy= QtCore.QSortFilterProxyModel()
self.proxy.setSourceModel(self.model)
self.tableEntity.setModel(self.proxy)
self.tableEntity.resizeColumnsToContents()
def change_display_result(self,selected,deselected):
index_entity = self.tableEntity.selectionModel().selectedIndexes()
temp_entity = self.tableEntity.selectionModel().model()
for index in sorted(index_entity):
print(str(temp_entity.data(index)))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ReadResultWindow = QtWidgets.QMainWindow()
ui = Ui_ReadResultWindow()
ui.setupUi(ReadResultWindow)
ReadResultWindow.show()
sys.exit(app.exec_())
The reason why you get that error is that you did not set the model on the table before trying to access the selection-model. 出现该错误的原因是,您在尝试访问选择模型之前未在表上设置模型。 The best way to fix this is to move the model setup code out of
on_open_file
and into setupUi
. 解决此问题的最佳方法是将模型设置代码移出
on_open_file
并移入setupUi
。 The on_open_file
then just needs to clear the model before reloading the data. 然后,
on_open_file
仅需要在重新加载数据之前清除模型。
Below is a re-write of your example. 下面是您的示例的重写。 Note that I had to fix quite a few other things to get it to work (mainly the central-widget and layout).
请注意,我必须修复许多其他问题才能使其正常工作(主要是中央小部件和布局)。
import sys, random
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_ReadResultWindow(object):
def setupUi(self, ReadResultWindow):
ReadResultWindow.resize(661, 438)
self.tableEntity = QtWidgets.QTableView()
self.model = QtGui.QStandardItemModel()
self.proxy = QtCore.QSortFilterProxyModel()
self.proxy.setSourceModel(self.model)
self.tableEntity.setModel(self.proxy)
self.tableEntity.selectionModel().selectionChanged.connect(
self.change_display_result)
self.Open = QtWidgets.QPushButton('Test')
self.Open.clicked.connect(self.on_open_file)
widget = QtWidgets.QWidget(ReadResultWindow)
layout = QtWidgets.QVBoxLayout(widget)
layout.addWidget(self.tableEntity)
layout.addWidget(self.Open)
ReadResultWindow.setCentralWidget(widget)
def on_open_file(self):
self.model.setRowCount(0)
x = random.sample(range(10, 100), 10)
for item in x:
self.model.invisibleRootItem().appendRow(
QtGui.QStandardItem(str(item)))
self.tableEntity.resizeColumnsToContents()
def change_display_result(self,selected,deselected):
index_entity = self.tableEntity.selectionModel().selectedIndexes()
temp_entity = self.tableEntity.selectionModel().model()
for index in sorted(index_entity):
print(str(temp_entity.data(index)))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ReadResultWindow = QtWidgets.QMainWindow()
ui = Ui_ReadResultWindow()
ui.setupUi(ReadResultWindow)
ReadResultWindow.show()
sys.exit(app.exec_())
you must first set the model. 您必须先设置模型。 So you can do something like this:
因此,您可以执行以下操作:
self.tableEntity = QtWidgets.QTableView(self.centralWidget)
self.tableEntity.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
you can set one of this models: { NoSelection, SingleSelection, MultiSelection, ExtendedSelection, ContiguousSelection }
您可以设置以下模型之一:
{ NoSelection, SingleSelection, MultiSelection, ExtendedSelection, ContiguousSelection }
hope this help 希望这个帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.