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 有复选框来选择项目)