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
С Уважением,