Come estrarre il contenuto, frutto di selectedItems ()
-
26-10-2019 - |
Domanda
Il codice illustrato un piccola finestra di dialogo come quella mostrata, dove le righe della tabella possono essere selezionati (CTRL per selezione multipla, o attiva / off). Quindi fare clic sul pulsante 'Ok', il contenuto delle selezioni sono disponibili utilizzando selectedItems (). Il problema è che sembra ogni 'voce' come questo: <PySide.QtGui.QTableWidgetItem object at 0x00FF0558>
.
Dopo selectedItems (), come è il contenuto estratto?
La documentazione all'indirizzo http://www.pyside.org/docs/pyside/PySide/QtGui/QTableWidget non dice.
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_()
Soluzione
Come l'altra risposta menzionato è possibile utilizzare .text () il metodo del QTableWidgetItem per ottenere il contenuto.
Come è evidente documentazione PySide non dà indicazioni sul tipo di resi rendendo più difficile per capire quali metodi per fare uso di. In tali scenari, è utile controllare Qt documentazione relativa alla classe stessa per avere maggiori dettagli su i metodi che sarebbero disponibili. Ad esempio, nel vostro caso si può guardare documentazione Qt per QTableWidget che rende più facile trovare quali metodi da chiamare.
Altri suggerimenti
Chiamare il metodo .text()
su ogni QTableWidgetItem. L'unico argomento al costruttore QtGui.QTableWidgetItem è questo stesso valore.
Più informazioni qui: PySide.QtGui.QTableWidgetItem.text ()
Hmm. Aveva trascorso molto tempo alla ricerca di quella risposta, ha iniziato mettendo insieme la questione, avvenuto attraverso la risposta, e ha deciso di postare la questione in ogni caso e poi rispondere, per gli altri, allora scoperto di avere un periodo di attesa di otto ore prima che potessi rispondere alla mia stessa domanda. Nel frattempo due altre belle risposte. In ogni caso, questa è stata la mia:
item.text ()
... vi mostrerà il contenuto di ciascuna cella (per eventuali righe selezionate):
for item in self.myTable.selectedItems():
print item.text()
... stampe:
someone@gmail.com
Some One
3E0B001E
Si può anche scegliere di ciliegio il contenuto di una cella particolare, ad esempio, ecco un modo:
self.myTable.selectedItems()[1].text()
(Purtroppo il ciclo precedente legge inferiormente da colonne successive anziché riga per riga così dovrà trovare un modo per affrontare questo)