Pregunta

El siguiente código produce un pequeño cuadro de diálogo como el que se muestra, donde se pueden seleccionar las filas de la tabla (tecla CTRL para seleccionar múltiples seleccionar o encender/apagar). Luego haciendo clic en el botón 'Aceptar', el contenido de las selecciones está disponible usando SelectEnItems (). El problema es que cada 'elemento' se ve así: <PySide.QtGui.QTableWidgetItem object at 0x00FF0558>.

Después de SelectedItems (), ¿cómo se extrae el contenido?

La documentación en http://www.pyside.org/docs/pyside/pyside/qtgui/qtablewidget No dice.

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: [   '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_()
¿Fue útil?

Solución

Como se mencionó la otra respuesta, puede usar .texto() método del QtableWidgetItem Para obtener el contenido.

Como es evidente, la documentación de Pyside no da una indicación sobre el tipo de elementos devueltos, lo que hace que sea más difícil descubrir qué métodos utilizar. En tales escenarios es útil verificar Clase QT Documentación misma para obtener más detalles sobre los métodos que estarían disponibles. Por ejemplo, en su caso, puede buscar documentos QT para QtableWidget lo que hace que sea más fácil encontrar qué métodos llamar.

Otros consejos

Llama a .text() Método en cada qtableWidgetItem. El argumento único al constructor qtgui.qtablewidgetitem es este mismo valor.

Más información aquí: Pyside.qtgui.qtablewidgetitem.text ()

Mmm. Había pasado mucho tiempo buscando esa respuesta, comenzó a formular la pregunta, se encontró en la respuesta y decidió publicar la pregunta de todos modos y luego respondiendo, para otros, luego descubrí que tenía un período de espera de 8 horas antes de poder responder a mi propia pregunta. Mientras tanto, otras dos respuestas finas. De todos modos, esto era mío:

item.text ()

... le mostrará el contenido de cada celda (para cualquier fila seleccionada):

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

...huellas dactilares:

someone@gmail.com
Some One
3E0B001E

También puede elegir el contenido de una celda en particular, por ejemplo, aquí hay una forma:

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

(Desafortunadamente, el bucle anterior se lee hacia abajo por columnas sucesivas en lugar de fila por fila, por lo que tendrá que encontrar una manera de lidiar con eso)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top