如何使用 cellWidget 处理来自 QTableWidget 单元格的信号
how to work signals from QTableWidget cell with cellWidget
我在 QTableWidget 上工作过,问题是如果单元格是由 QTableWidgetItem 设置的,信号 'itemChanged' 工作得很好,很容易得到 row/column/text,但是如果单元格是由像 QLineEdit 这样的 cellWidget 设置的,那么信号'itemChanged'不行,单'textChanged'或者QLineEdit本身就可以,但是如果有几百个QLineEdit就太难了,有没有可能像itemChanged一样工作?请帮忙,谢谢。
代码如下:
import sys
from PyQt5.QtWidgets import *
class Table(QWidget):
def __init__(self):
super(Table, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Example")
self.resize(400,300)
self.layout=QHBoxLayout()
self.TableWidget=QTableWidget(4,3)
self.TableWidget.setHorizontalHeaderLabels(['Nmae','Sex','Weight(kG)'])
# self.newItem=QTableWidgetItem('Jack')
# self.TableWidget.setItem(0,0,self.newItem)
# self.newItem=QTableWidgetItem('Male')
# self.TableWidget.setItem(0,1,self.newItem)
# self.newItem=QTableWidgetItem('160')
# self.TableWidget.setItem(0,2,self.newItem)
self.newItem=QLineEdit('Jack')
self.TableWidget.setCellWidget(0,0,self.newItem)
self.newItem.textChanged.connect(self.txtChange)
self.newItem=QLineEdit('Male')
self.TableWidget.setCellWidget(0,1,self.newItem)
self.newItem=QLineEdit('160')
self.TableWidget.setCellWidget(0,2,self.newItem)
self.layout.addWidget(self.TableWidget)
self.setLayout(self.layout)
self.TableWidget.itemChanged.connect(self.changeTest)
def changeTest(self,item):
# print('test')
print(item.text())
def txtChange(self,txt):
print(txt)
if __name__ == '__main__':
app=QApplication(sys.argv)
win=Table()
win.show()
sys.exit(app.exec_())
一种可能的解决方案是不使用 cellWidget,而是永久打开委托编辑器:
class StyledItemDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
return QLineEdit(parent)
class Table(QWidget):
def __init__(self):
super(Table, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Example")
self.resize(400, 300)
self.tableWidget = QTableWidget(4, 3)
delegate = StyledItemDelegate(self)
self.tableWidget.setItemDelegate(delegate)
self.tableWidget.setHorizontalHeaderLabels(["Nmae", "Sex", "Weight(kG)"])
self.tableWidget.itemChanged.connect(self.changeTest)
lay = QHBoxLayout(self)
lay.addWidget(self.tableWidget)
it = QTableWidgetItem("Jack")
self.tableWidget.setItem(0, 0, it)
self.tableWidget.openPersistentEditor(it)
it = QTableWidgetItem("Male")
self.tableWidget.setItem(0, 1, it)
self.tableWidget.openPersistentEditor(it)
it = QTableWidgetItem("160")
self.tableWidget.setItem(0, 2, it)
self.tableWidget.openPersistentEditor(it)
def changeTest(self, item):
print(item.text())
我在 QTableWidget 上工作过,问题是如果单元格是由 QTableWidgetItem 设置的,信号 'itemChanged' 工作得很好,很容易得到 row/column/text,但是如果单元格是由像 QLineEdit 这样的 cellWidget 设置的,那么信号'itemChanged'不行,单'textChanged'或者QLineEdit本身就可以,但是如果有几百个QLineEdit就太难了,有没有可能像itemChanged一样工作?请帮忙,谢谢。
代码如下:
import sys
from PyQt5.QtWidgets import *
class Table(QWidget):
def __init__(self):
super(Table, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Example")
self.resize(400,300)
self.layout=QHBoxLayout()
self.TableWidget=QTableWidget(4,3)
self.TableWidget.setHorizontalHeaderLabels(['Nmae','Sex','Weight(kG)'])
# self.newItem=QTableWidgetItem('Jack')
# self.TableWidget.setItem(0,0,self.newItem)
# self.newItem=QTableWidgetItem('Male')
# self.TableWidget.setItem(0,1,self.newItem)
# self.newItem=QTableWidgetItem('160')
# self.TableWidget.setItem(0,2,self.newItem)
self.newItem=QLineEdit('Jack')
self.TableWidget.setCellWidget(0,0,self.newItem)
self.newItem.textChanged.connect(self.txtChange)
self.newItem=QLineEdit('Male')
self.TableWidget.setCellWidget(0,1,self.newItem)
self.newItem=QLineEdit('160')
self.TableWidget.setCellWidget(0,2,self.newItem)
self.layout.addWidget(self.TableWidget)
self.setLayout(self.layout)
self.TableWidget.itemChanged.connect(self.changeTest)
def changeTest(self,item):
# print('test')
print(item.text())
def txtChange(self,txt):
print(txt)
if __name__ == '__main__':
app=QApplication(sys.argv)
win=Table()
win.show()
sys.exit(app.exec_())
一种可能的解决方案是不使用 cellWidget,而是永久打开委托编辑器:
class StyledItemDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
return QLineEdit(parent)
class Table(QWidget):
def __init__(self):
super(Table, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Example")
self.resize(400, 300)
self.tableWidget = QTableWidget(4, 3)
delegate = StyledItemDelegate(self)
self.tableWidget.setItemDelegate(delegate)
self.tableWidget.setHorizontalHeaderLabels(["Nmae", "Sex", "Weight(kG)"])
self.tableWidget.itemChanged.connect(self.changeTest)
lay = QHBoxLayout(self)
lay.addWidget(self.tableWidget)
it = QTableWidgetItem("Jack")
self.tableWidget.setItem(0, 0, it)
self.tableWidget.openPersistentEditor(it)
it = QTableWidgetItem("Male")
self.tableWidget.setItem(0, 1, it)
self.tableWidget.openPersistentEditor(it)
it = QTableWidgetItem("160")
self.tableWidget.setItem(0, 2, it)
self.tableWidget.openPersistentEditor(it)
def changeTest(self, item):
print(item.text())