2016-09-09 4 views
0

Если я пытаюсь получить сигнал, когда мои изменения Tableview, Python вызывает эту ошибку:Ошибка из 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' 

я определяю tableEntity как:

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

Edit: В первый мой 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 и в setupUi. Затем on_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 }

надежду, что эта помощь

Смежные вопросы