Pyqt如何获取文本为空的QTableWidget项目对象

Posted

技术标签:

【中文标题】Pyqt如何获取文本为空的QTableWidget项目对象【英文标题】:Pyqt how to get QTableWidget item object whose text is empty 【发布时间】:2017-03-03 08:36:09 【问题描述】:

我有 3*3 的表格小部件,但项目的文本是空的

self.tab = QtGui.QTableWidget() 
self.tab.setRowCount(3)
self.tab.setColumnCount(3)
self.tab.itemSelectionChanged.connect(self.fuc)

我有一个功能:我点击一个项目,所以我可以使用 QFileDialog 来获取我的文件路径,然后文件路径显示在我的项目中。

     def fuc(self):
        itemClicked = self.sender()
        index = self.tab.indexAt(itemClicked.pos())
        filename = QtGui.QFileDialog.getOpenFileName(self, 'OpenFile')
        row = index.row()
        col = index.column()
        self.tab.item(row, col).setText(filename)

但是有一个错误AttributeError: 'NoneType' object has no attribute 'setText'。我发现item的文本是否为空,我无法获取item对象。item是

【问题讨论】:

你需要使用按钮连接到你的函数,并且在你的函数中你需要检查是否有数据(你可以使用if filename)。 @ShubhamNamdeo 我刚开始使用按钮连接我的功能,但现在我想让我的 UI 操作更容易。有没有办法即使没有数据也可以获取项目对象? 【参考方案1】:

不只是项目文本为空,甚至项目还没有文本属性。简短的回答是尝试/捕捉(查看this question 的所有答案)

def _clickedCell(self, item):
    print(type(item))
    try:
        self.text_label.setText(self.table.item(item.row(), item.column()).text())
    except AttributeError:
        self.text_label.setText('Cell did not have a text property')
    except:
        self.text_label.setText('Something else went wrong')

但还有一点让我感到惊讶——传递给_clickedCell 处理程序的item 并不完全是定义的QTableWidgetItem,即使它 已定义。我在简短答案中的相同 try/catch 之前添加了一些 print 调试。

这是一个小型应用程序,它只设置一些 QTableWidget 项文本值,并且可以显示单击的单元格文本值,或者处理缺少的 text 属性:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHeaderView, QFrame,\
                        QLabel, QTableWidget, \
                        QTableWidgetItem, QVBoxLayout, QHBoxLayout

class TableWidget(QTableWidget):
    def __init__(self):
        super().__init__(2,2)
        self.setHorizontalHeaderLabels(['Text Set', 'Text Not Set'])
        self.setItem(0, 0,  QTableWidgetItem("dummy text"))
        self.setItem(1, 0,  QTableWidgetItem(""))
        self.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)





class AppDemo(QWidget):
    def __init__(self):
        super().__init__()

        mainLayout = QHBoxLayout()
        self.table = TableWidget()
        self.table.clicked.connect(self._clickedCell)
        mainLayout.addWidget(self.table)
    
        buttonLayout = QVBoxLayout()

        self.text_label = QLabel('Initialized value')
        self.text_label.setFrameStyle(QFrame.Panel)
        self.text_label.setMinimumWidth(70)
        self.text_label.setWordWrap(True)
        buttonLayout.addWidget(self.text_label)

        mainLayout.addLayout(buttonLayout)
        self.setLayout(mainLayout)

    def _clickedCell(self, item):
        print(item.row(), item.column())
        print(type(item))
        print(type(self.table.item(item.row(), item.column())))
     
        try:
            self.text_label.setText(self.table.item(
                  item.row(), item.column()).text())
        except AttributeError:
            self.text_label.setText('AttributeError: Cell had no text property')
        except:
            self.text_label.setText('Something else went wrong')
        


app = QApplication(sys.argv)
demo = AppDemo()
demo.show()
sys.exit(app.exec_())

# from https://learndataanalysis.org/add-copy-remove-rows-on-a-table-widget-pyqt5-tutorial/ 

【讨论】:

以上是关于Pyqt如何获取文本为空的QTableWidget项目对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 QTableWidget 中获取选定索引中的项目总和

如何在PyQt QTableWidget中获取seletedIndexes中的项目总和

pyqt Qtablewidget 获取选中多行的行号或者内容

如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中? (QComboBox 有复选框来选择项目)

[ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

如何在 PyQt5 中捕获 QTableWidget 上的左右鼠标单击事件?