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.

Esempio della finestra di dialogo, risultato del codice

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_()
È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top