2016-09-09 103 views
0

如果我尝试获取信号时,我的tableview改变,Python会引发此错误:错误参考selectionChanged

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' 

我定义tableEntity为:

self.tableEntity = QtWidgets.QTableView(self.centralWidget) 

编辑:首先我QTableView是空的。我必须打开一个文件来填充它。

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_()) 

回答

1

为什么你得到这个错误的原因是你没有设置模型在尝试访问选择模型之前在表上。解决此问题的最佳方法是将模型设置代码从on_open_file中移出并移入setupUion_open_file然后只需在重新加载数据之前清除模型。

下面是你的例子的重写。请注意,我不得不修复其他一些事情才能使其工作(主要是中心小部件和布局)。

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_()) 
+0

感谢您的更正和帮助! – Coolpix

0

您必须先设置模式。所以,你可以做这样的事情:

self.tableEntity = QtWidgets.QTableView(self.centralWidget) 
self.tableEntity.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 

你可以把这个模式之一:{ NoSelection, SingleSelection, MultiSelection, ExtendedSelection, ContiguousSelection }

希望这有助于