Как извлечь содержимое, результат selectedItems () - PullRequest
2 голосов
/ 01 декабря 2011

Приведенный ниже код создает небольшое диалоговое окно, подобное показанному, где можно выбрать строки таблицы (клавиша CTRL для множественного выбора или включение / выключение). Затем, нажав кнопку «ОК», содержимое выборок доступно с помощью selectedItems (). Проблема в том, что каждый «элемент» выглядит так: <PySide.QtGui.QTableWidgetItem object at 0x00FF0558>.

После 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: [   '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_()

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

В качестве другого упомянутого ответа вы можете использовать .text () метод QTableWidgetItem для получения содержимого.

Как видно, в документации на стороне не указывается тип возвращаемых предметов, что затрудняет выяснение, какие методы использовать. В таких случаях полезно проверить документацию Qt class , чтобы получить более подробную информацию о доступных методах. Например, в вашем случае вы можете посмотреть документацию Qt для QTableWidget , которая упрощает поиск методов для вызова.

3 голосов
/ 01 декабря 2011

Вызовите метод .text() для каждого QTableWidgetItem. Единственный аргумент конструктора QtGui.QTableWidgetItem - это то же значение.

Подробнее здесь: PySide.QtGui.QTableWidgetItem.text ()

1 голос
/ 02 декабря 2011

Хм. Он потратил много времени на поиск этого ответа, начал составлять вопрос, случайно встретил ответ и решил в любом случае опубликовать вопрос, а затем ответить на него для других, а затем обнаружил, что у меня есть 8-часовой период ожидания, прежде чем я смог ответить собственный вопрос Между тем два других прекрасных ответа. Во всяком случае, это было мое:

item.text ()

... покажет вам содержимое каждой ячейки (для любых выбранных строк):

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

... печать:

someone@gmail.com
Some One
3E0B001E

Вы также можете выбрать содержимое определенной ячейки, например, вот один из способов:

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

(К сожалению, цикл выше читает вниз по последовательным столбцам вместо строки за строкой, поэтому придется искать способ с этим справиться)

...