2016-09-09 2 views
0

Si je tente d'obtenir le signal lorsque mes changements de Tableview, Python déclenche cette erreur:Erreur de QTableView 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' 

Je définis tableEntity comme:

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

Modifier: Tout d'abord mon QTableView est vide. Je dois ouvrir un fichier pour le remplir.

Edit2: Pour être plus précis, j'ai quelque chose comme ceci:

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

Répondre

1

La raison pour laquelle vous obtenez cette erreur est que vous n'avez pas défini le modèle sur la table avant d'essayer d'accéder au modèle de sélection. La meilleure façon de résoudre ce problème consiste à déplacer le code d'installation du modèle sur on_open_file et sur setupUi. Le on_open_file doit juste effacer le modèle avant de recharger les données.

Vous trouverez ci-dessous une réécriture de votre exemple. Notez que j'ai dû corriger un certain nombre d'autres choses pour le faire fonctionner (principalement le widget central et la mise en page).

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

Merci pour vos corrections et pour votre aide! – Coolpix

0

vous devez d'abord définir le modèle. Ainsi, vous pouvez faire quelque chose comme ceci:

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

vous pouvez définir un de ces modèles: { NoSelection, SingleSelection, MultiSelection, ExtendedSelection, ContiguousSelection }

espoir cette aide