如何提取selectedItems()的结果内容
下面的代码会弹出一个小对话框,里面有一个表格,你可以选择表格中的行(按住CTRL键可以多选,或者可以切换选择和取消选择)。然后点击“确定”按钮后,选择的内容可以通过selectedItems()来获取。问题是,每个“项目”的显示方式是这样的:<PySide.QtGui.QTableWidgetItem object at 0x00FF0558>
。
在使用selectedItems()之后,怎么才能提取出具体的内容呢?
在这个文档里没有说明。
from PySide import QtGui, QtCore
class A_Dialog(QtGui.QMainWindow):
def __init__(self, parent=None):
super(A_Dialog, self).__init__(parent)
self.setupUi(self)
def setupUi(self, MainWindow):
self.buttonBox_ok_cancel = QtGui.QDialogButtonBox(MainWindow)
self.buttonBox_ok_cancel.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
QtCore.QObject.connect(self.buttonBox_ok_cancel, QtCore.SIGNAL("accepted()"), self.button_ok)
QtCore.QObject.connect(self.buttonBox_ok_cancel, QtCore.SIGNAL("rejected()"), self.button_cancel)
content = {
1: [ 'someone@gmail.com',
'Some One',
'3E0B001E'
],
2: [ 'someelse@yahoo.com',
'Some Else',
'6C8EAA39',
],
}
# Table for content
self.myTable = QtGui.QTableWidget(0, 3)
self.myTable.setHorizontalHeaderLabels(['Email','Name','ID'])
self.myTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.myTable.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.myTable.horizontalHeader().setStretchLastSection(True)
self.myTable.verticalHeader().setDefaultSectionSize(18) # Vertical height of rows
self.myTable.verticalHeader().setResizeMode(QtGui.QHeaderView.Fixed)
# Populate the cells
for k in content.keys():
self.myTable.insertRow( k-1 )
c = 0
for z in content[k]:
self.myTable.setItem( k-1, c, QtGui.QTableWidgetItem( z ) )
c += 1
# Auto-size
self.myTable.resizeColumnsToContents()
# A little padding on the right for each column, some room to breath, pixels.
padding = 12
for col in range(len(content[1])):
current_column_width = self.myTable.columnWidth(col)
self.myTable.setColumnWidth( col, current_column_width + padding )
self.myTable.setWordWrap(False)
self.myTable.setShowGrid(False)
self.myTable.setSortingEnabled(True)
self.myTable.setDragDropOverwriteMode(False)
self.myTable.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
horizontalLayout = QtGui.QHBoxLayout()
horizontalLayout.addWidget(self.buttonBox_ok_cancel)
verticalLayout = QtGui.QVBoxLayout()
verticalLayout.addWidget(self.myTable)
verticalLayout.addLayout(horizontalLayout)
widget = QtGui.QWidget()
widget.setLayout(verticalLayout)
self.setCentralWidget(widget)
def button_ok(self):
for item in self.myTable.selectedItems():
#for item in self.myTable.selectedIndexes():
print "MMM", item
self.close()
def button_cancel(self):
self.close()
def closeEvent(self, e):
e.accept()
if __name__ == '__main__':
app = QtGui.QApplication([])
window = A_Dialog()
window.show()
app.exec_()
4 个回答
2
嗯。我花了很多时间寻找这个答案,开始整理问题的时候,偶然找到了答案,决定还是把问题发出来,然后自己回答一下,方便其他人参考。结果发现我得等8个小时才能发,期间又有两个不错的答案出现。总之,这个是我的答案:
item.text()
... 这个方法会显示你选择的每一行的内容:
for item in self.myTable.selectedItems():
print item.text()
...输出结果是:
someone@gmail.com
Some One
3E0B001E
你也可以单独选择某个单元格的内容,比如,这里有一种方法:
self.myTable.selectedItems()[1].text()
(不幸的是,上面的循环是按列向下读取的,而不是按行读取,所以得想办法解决这个问题)
3
对每个 QTableWidgetItem 调用 .text()
方法。创建 QtGui.QTableWidgetItem 时传入的唯一参数就是这个值。
更多信息可以查看这里: PySide.QtGui.QTableWidgetItem.text()
4
正如其他回答提到的,你可以使用 .text() 方法来获取 QTableWidgetItem 的内容。
很明显,pyside 的文档没有说明返回的项目类型,这让我们很难知道该用哪些方法。在这种情况下,查看 Qt 类 的文档会很有帮助,这样可以了解可用的方法。例如,在你的情况下,你可以查看 Qt 文档中的 QTableWidget,这样就更容易找到该调用哪些方法了。