PyQt QTableWidget получить отредактированное поле

Я довольно новичок в PyQt, и я делаю графический интерфейс в PyQt4 и Python 2.7, который (среди прочего) контролирует настройки нескольких микроконтроллеров. Чтобы легко заполнить и отобразить список настроек и какой контроллер они используют, я поместил его в QTableWidget, где столбцы являются контроллерами, а строки - настройками (все контроллеры просто дублируют друг друга, хотя не все настройки будут быть одинаковым значением от контроллера к контроллеру).

У меня проблема в том, что когда пользователь редактирует ячейку, я пытаюсь получить это новое значение с

value = self.Settings1Table.item(n, s).text()

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

Весь код довольно большой, и я чувствовал, что нет необходимости публиковать его целиком, но если потребуется больше кода, я буду рад предоставить. Спасибо за помощь, я надеюсь, придет.

Редактировать: вот метод, который перебирает каждый элемент в таблице, он должен получить текущее значение, но сейчас возвращает только значение, которое я установил с помощью item.setText(str) (должно быть значение, которое пользователь вводится с клавиатуры)

def ApplyAll1(self):
    if not self.CheckHealth():
        for s in xrange(NumOfSegs):
            n = 0
            for item in Settings1List:
                value = self.Settings1Table.item(n, s).text()
                print value
    else:
        self.MsgCntrField.setText("CONNECTION ERROR")

Self.CheckHealth() - это просто проверка ошибок

1 ответ

Решение

ПОСЛЕДНИЕ ОБНОВЛЕНО 8 / 19 / 2014 0: 29

Меня не волнует событие, так как я собираюсь перебрать всю таблицу, мне нужно, чтобы данные изменялись с помощью клавиатуры, а не 'QtGui.QTableWidgetItem.setText', так что да

ОК, возможно создать событие, а затем только клавиатуру, но вы должны реализовать QtGui.QTableWidget.focusInEvent(self, eventQFocusEvent) а также QtGui.QTableWidget.focusOutEvent(self, eventQFocusEvent), Итак, посмотрите пример кода, надеюсь, это помощь;

import sys
from PyQt4 import QtGui, QtCore

class QCustomTableWidget (QtGui.QTableWidget):
    def __init__ (self, parent = None):
        super(QCustomTableWidget, self).__init__(parent)
        self.focusKeyboardOn = False
        # Setup row & column data
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4', 'Device 5']
        self.setRowCount(len(listsVerticalHeaderItem))
        for index in range(self.rowCount()):
            self.setVerticalHeaderItem(index, QtGui.QTableWidgetItem(listsVerticalHeaderItem[index]))
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4']
        self.setColumnCount(5)
        listsHorizontalHeaderItem = ['Option 1', 'Option 2']
        self.setColumnCount(len(listsHorizontalHeaderItem))
        for index in range(self.columnCount()):
            self.setHorizontalHeaderItem(index, QtGui.QTableWidgetItem(listsHorizontalHeaderItem[index]))

    def dataChanged (self, topLeftQModelIndex, bottomRightQModelIndex):
        row                  = topLeftQModelIndex.row()
        column               = topLeftQModelIndex.column()
        dataQTableWidgetItem = self.item(row, column)
        if (self.currentItem() == dataQTableWidgetItem) and (self.focusKeyboardOn == True):
            self.emit(QtCore.SIGNAL('currentKeyboardDataChanged'), row, column, dataQTableWidgetItem)
        self.emit(QtCore.SIGNAL('dataChanged'), row, column, dataQTableWidgetItem)
        QtGui.QTableWidget.dataChanged(self, topLeftQModelIndex, bottomRightQModelIndex)

    def focusInEvent (self, eventQFocusEvent):
        self.focusKeyboardOn = False
        QtGui.QTableWidget.focusInEvent(self, eventQFocusEvent)

    def focusOutEvent (self, eventQFocusEvent):
        self.focusKeyboardOn = True
        QtGui.QTableWidget.focusOutEvent(self, eventQFocusEvent)

class QCustomWidget (QtGui.QWidget):
    def __init__(self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        self.myQCustomTableWidget = QCustomTableWidget(self)
        self.myQLabel = QtGui.QLabel('Track edited data', self)
        myQVBoxLayout = QtGui.QVBoxLayout()
        myQVBoxLayout.addWidget(self.myQLabel)
        myQVBoxLayout.addWidget(self.myQCustomTableWidget)
        self.setLayout(myQVBoxLayout)
        self.connect(self.myQCustomTableWidget, QtCore.SIGNAL('currentKeyboardDataChanged'), self.setTrackData)
        self.myQCustomTableWidget.setItem(0, 0, QtGui.QTableWidgetItem('Test'))
        self.myQCustomTableWidget.setItem(1, 1, QtGui.QTableWidgetItem('Work'))

    def setTrackData (self, row, column, dataQTableWidgetItem):
        self.myQLabel.setText('Last updated\nRow : %d, Column : %d, Data : %s' % (row + 1, column + 1, str(dataQTableWidgetItem.text())))

if __name__ == '__main__':
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomWidget = QCustomWidget()
    myQCustomWidget.show()
    sys.exit(myQApplication.exec_())

ПРИМЕЧАНИЕ: он имеет 1 кодировку, чтобы иметь ошибку: если ваш набор 'QtGui.QTableWidgetItem.setText' во время редактирования с помощью клавиатуры активен. Но если ваш строгий случай, я предлагаю создать свой собственный виджет и установить делегировать свой элемент. (Но, очень хардкор...)


Я не знаю, что такое данные в твоей камере, что это такое. (Это еще один обычай QWidget или это просто нормальные данные QTableWidgetItem)

В любом случае, когда пользователь редактирует ячейку, вы пытаетесь получить это новое значение с помощью этого метода. QAbstractItemView.dataChanged (self, QModelIndex topLeft, QModelIndex bottomRight), Этот метод возвращает позицию данных, отредактированных, и вы получаете данные из индекса, используя QTableWidgetItem QTableWidget.item (self, int row, int column), (Это то, что вы говорите, это вопрос) Но эта работа только редактирование имеет близко (не во время редактирования).

Пример;

import sys
from PyQt4 import QtGui, QtCore

class QCustomTableWidget (QtGui.QTableWidget):
    def __init__ (self, parent = None):
        super(QCustomTableWidget, self).__init__(parent)
        # Setup row & column data
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4', 'Device 5']
        self.setRowCount(len(listsVerticalHeaderItem))
        for index in range(self.rowCount()):
            self.setVerticalHeaderItem(index, QtGui.QTableWidgetItem(listsVerticalHeaderItem[index]))
        listsVerticalHeaderItem = ['Device 1', 'Device 2', 'Device 3', 'Device 4']
        self.setColumnCount(5)
        listsHorizontalHeaderItem = ['Option 1', 'Option 2']
        self.setColumnCount(len(listsHorizontalHeaderItem))
        for index in range(self.columnCount()):
            self.setHorizontalHeaderItem(index, QtGui.QTableWidgetItem(listsHorizontalHeaderItem[index]))

    def dataChanged (self, topLeftQModelIndex, bottomRightQModelIndex):
        row                  = topLeftQModelIndex.row()
        column               = topLeftQModelIndex.column()
        dataQTableWidgetItem = self.item(row, column)
        print '###### Data Changed  ######'
        print 'row    :', row + 1
        print 'column :', column + 1
        print 'data   :', dataQTableWidgetItem.text()
        self.emit(QtCore.SIGNAL('dataChanged'), row, column, dataQTableWidgetItem)
        QtGui.QTableWidget.dataChanged(self, topLeftQModelIndex, bottomRightQModelIndex)

class QCustomWidget (QtGui.QWidget):
    def __init__(self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        self.myQCustomTableWidget = QCustomTableWidget(self)
        self.myQLabel = QtGui.QLabel('Track edited data', self)
        myQVBoxLayout = QtGui.QVBoxLayout()
        myQVBoxLayout.addWidget(self.myQLabel)
        myQVBoxLayout.addWidget(self.myQCustomTableWidget)
        self.setLayout(myQVBoxLayout)
        self.connect(self.myQCustomTableWidget, QtCore.SIGNAL('dataChanged'), self.setTrackData)

    def setTrackData (self, row, column, dataQTableWidgetItem):
        self.myQLabel.setText('Last updated\nRow : %d, Column : %d, Data : %s' % (row + 1, column + 1, str(dataQTableWidgetItem.text())))

if __name__ == '__main__':
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomWidget = QCustomWidget()
    myQCustomWidget.show()
    sys.exit(myQApplication.exec_())

QAbstractItemView.dataChanged (self, QModelIndex topLeft, QModelIndex bottomRight) Ссылка: http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemview.html


С Уважением,

Другие вопросы по тегам