SelectionQtableView更改错误

2024-09-29 21:30:26 发布

您现在位置:Python中文网/ 问答频道 /正文

如果在tableview更改时尝试获取信号,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'

我将tableEntity定义为:

^{pr2}$

编辑:起初我的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_())

Tags: inselfuiindexmodelopenentityqtwidgets
2条回答

您必须先设置模型。所以你可以这样做:

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

您可以设置以下模型之一:{ NoSelection, SingleSelection, MultiSelection, ExtendedSelection, ContiguousSelection }

希望能帮上忙

出现此错误的原因是,在尝试访问选择模型之前,没有在表上设置模型。解决此问题的最佳方法是将模型设置代码移出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_())

相关问题 更多 >

    热门问题