2011-12-01 53 views
2

下面的代碼會生成一個如圖所示的小對話框,其中可以選擇表的行(CTRL鍵用於多選或打開/關閉)。然後點擊'確定'按鈕,選擇的內容可以使用selectedItems()。問題是每個'項目'看起來像這樣:<PySide.QtGui.QTableWidgetItem object at 0x00FF0558>如何提取selectedItems的結果()

after selectedItems()後,內容是如何提取的?

http://www.pyside.org/docs/pyside/PySide/QtGui/QTableWidget的文檔沒有說明。

Example of the dialog box, result of the code

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: [ '[email protected]', 
        'Some One', 
        '3E0B001E' 
       ], 
      2: [ '[email protected]', 
        '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_() 

回答

3

如前所述,您可以使用的.text()的 QTableWidgetItem方法來獲取內容的其他答案。

由於明顯的pyside文檔沒有給出關於返回項的類型的指示,使得難以找出使用哪種方法。在這種情況下,檢查Qt class文檔本身以獲取有關可用方法的更多詳細信息很有用。例如,在你的情況下,你可以看看Qt文檔QTableWidget,這使得更容易找到要調用的方法。

1

嗯。花了很多時間尋找答案,開始把問題放在一起,發生在答案上,然後決定發佈問題,然後回答問題,然後發現我有8小時的等待期,然後才能回答我的問題自己的問題。同時還有兩個很好的答案。無論如何,這是我的:

item.text()

...會告訴你每個單元格的內容(任何選定行):

for item in self.myTable.selectedItems():    
    print item.text() 

...打印:

[email protected] 
Some One 
3E0B001E 

您也可以挑櫻桃特定單元格的內容,例如,這裏有一個方法:

self.myTable.selectedItems()[1].text() 

(不幸的是,上述循環向下連續列而不是逐行讀取所以必須找到一種方式來處理那些)