【问题标题】:PyQt QTableWidget retrieve edited fieldPyQt QTableWidget 检索已编辑的字段
【发布时间】:2014-08-17 17:28:35
【问题描述】:

我对 PyQt 相当陌生,我正在 PyQt4 和 Python 2.7 中制作一个 GUI,它(除其他外)控制少数微控制器的设置。为了轻松填充和显示设置列表,以及它们来自哪个控制器,我将其放入 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() 只是错误检查

【问题讨论】:

  • 所以,您的问题是“当用户编辑数据时,如何获取 QTableWidget 的编辑数据,将其添加到变量中”。对吗?

标签: python python-2.7 pyqt4 qtablewidget qtablewidgetitem


【解决方案1】:

最后更新时间 2014 年 8 月 19 日 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 个代码存在 BUG:如果您在通过键盘激活时通过“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#dataChanged


问候,

【讨论】:

  • 感谢您的回复。我无法弄清楚该代码如何知道该字段何时被编辑。我没有看到 cellChanged 的​​任何信号或程序知道焦点已更改的任何方式。这种变化实际上发生在哪里?我的代码遍历所有单元格,因此知道哪个已更改并不是很重要,只需让更改后的数据可调用(我假设使用 item.text() )我将添加到 OP 我的“应用”代码这需要所有假定的当前值(但实际上不是当前值,因此是我的问题)
  • 另外,回答你的第一个问题,我指的数据是QTableWidgetItem
  • 现在,我很困惑(对不起)。我的程序(此答案代码)显示了如何在编辑字段时获取索引(行和列)和数据(因此,在编辑期间不做任何事情)。如果数据已更改并且您可以获取数据更改或索引它们,则此代码自动知道。你说,“我看不到 cellChanged 的​​任何信号,也看不到程序知道焦点已改变的任何方式。”这不是信号,它只是事件然后数据已被编辑。
  • 或者,你想跟踪事件然后只从键盘输入中获取数据,而不是'QtGui.QTableWidgetItem.setText',对吧?
  • 我不太关心这个事件,因为我要循环遍历整个表格,我确实需要通过键盘而不是'QtGui.QTableWidgetItem.setText'来更改数据,所以是的
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 2018-06-02
相关资源
最近更新 更多