Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt QTableWidget检索编辑字段_Python_Python 2.7_Pyqt4_Qtablewidget_Qtablewidgetitem - Fatal编程技术网

Python PyQt QTableWidget检索编辑字段

Python PyQt QTableWidget检索编辑字段,python,python-2.7,pyqt4,qtablewidget,qtablewidgetitem,Python,Python 2.7,Pyqt4,Qtablewidget,Qtablewidgetitem,我是PyQt的新手,我正在用PyQt4和Python2.7制作一个GUI,它(除其他外)控制一些微控制器的设置。为了方便地填充和显示设置列表,以及它们来自哪个控制器,我将其放入一个QTableWidget中,列是控制器,行是设置(所有控制器只是彼此重复,但并非所有设置在控制器之间都是相同的值) 我遇到的问题是,当用户编辑单元格时,我尝试使用新值 value = self.Settings1Table.item(n, s).text() 但这只检索我在填充过程中放置在单元格中的值,而不是刚通过键

我是PyQt的新手,我正在用PyQt4和Python2.7制作一个GUI,它(除其他外)控制一些微控制器的设置。为了方便地填充和显示设置列表,以及它们来自哪个控制器,我将其放入一个QTableWidget中,列是控制器,行是设置(所有控制器只是彼此重复,但并非所有设置在控制器之间都是相同的值)

我遇到的问题是,当用户编辑单元格时,我尝试使用新值

value = self.Settings1Table.item(n, s).text()
但这只检索我在填充过程中放置在单元格中的值,而不是刚通过键盘输入的值。我读过一个方法
currentText()
,但据我所知,它要求每个单元格都是它自己的小部件,我不知道如何做到这一点

整个代码相当大,我觉得没有必要全部发布,但是如果需要更多的代码,我很乐意提供。谢谢你的帮助,我希望你能来

编辑:这里是一个迭代表中每个项目的方法,它应该得到当前值,但现在只返回我通过item.setText(str)设置的值(需要是用户通过键盘输入的值)


self.CheckHealth()只是错误检查

最近更新的2014年8月19日0:29


我真的不在乎这件事,因为我要循环一下 整个表格,我确实需要用键盘来更改数据 “QtGui.QTableWidgetItem.setText”的,所以是的

好的,可能只创建事件然后键盘,但是您必须实现
QtGui.QTableWidget.focusInEvent(self,eventQFocusEvent)
QtGui.QTableWidget.focusOutEvent(self,eventQFocusEvent)
。所以,请看ny示例代码,希望是有帮助的

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_())
注意:如果通过键盘编辑时由'QtGui.QTableWidgetItem.settText'设置,则有1个密码存在错误。但如果您严格遵守it规范,我建议您创建自己的小部件,并设置自己的项目代理。(但是,非常核心的…)


我不知道你手机里的数据是什么。(它是另一个自定义的
QWidget
,或者它只是普通数据
QTableWidgetItem

无论如何,当用户编辑单元格时,您可以尝试使用此方法获取新值
qabstractemview.dataChanged(self、QModelIndex topLeft、QModelIndex bottomRight)
。此方法返回的数据位置已编辑,您可以使用
QTableWidgetItem QTableWidget.item(self、int行、int列)
从索引中获取数据。(这就是你所说的问题)但这项工作只有编辑已关闭(不在编辑期间)

榜样

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_())

qabstractemview.dataChanged(self,QModelIndex左上角,QModelIndex右下角)
参考



关于,

所以,您的问题是“当用户编辑数据时,我如何获得QTableWidget的编辑数据,将其固定到变量”。对吧?谢谢你的回复。我很难弄清楚这段代码是如何知道字段何时被编辑的。我看不到手机有任何改变的信号,也看不到程序有任何方式知道焦点已经改变。这种变化实际上发生在哪里?我的代码会遍历所有单元格,因此知道哪一个单元格已被更改并不十分重要,只是让更改的数据可以调用(我假设使用item.text())我将添加到OP我的“apply”代码中,该代码会接受所有假定的当前值(但实际上不是当前值,因此我的问题)来回答您的第一个问题,我所指的数据是QTableWidgetItemNow,我非常困惑(抱歉)。我的程序(这个答案代码)显示了当字段被编辑时如何获取索引(行和列)和数据(所以,在编辑过程中不做任何事情)。如果数据发生了更改,您可以从中获取更改的数据或为其编制索引,则该代码是自动生成的。你说,“我看不到cellChanged的任何信号,也看不到程序知道焦点已更改的任何方式。”这不是信号,只是事件,然后数据已被编辑。或者,你想跟踪事件,然后数据仅从键盘输入检查,而不是'QtGui.QTableWidgetItem.setText',对吗?我真的不关心事件,因为我要循环遍历整个表,所以我确实需要通过键盘更改数据,而不是“QtGui.QTableWidgetItem.settText”,所以是的
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_())