我知道这是一个初学者的问题,我搜索但找不到答案。
在应用中有一个QTableWidget
,其中包含QComboBox
,QDoubleSpinBox
和一些常规项目。
通过更改 ANY 单元格,我希望激活方法on_change
并打印一些内容。
以下代码不接受来自QComboBox
和QDoubleSpinBox
的更改信号。我怎么能纠正代码?
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
list_text = ["a", "b", "c"]
class App(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.createTable()
self.layout = QVBoxLayout()
self.layout.addWidget(self.tableWidget)
self.setLayout(self.layout)
self.show()
def createTable(self):
# Create table
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(6)
self.tableWidget.setColumnCount(2)
self.tableWidget.setItem(0, 0, QTableWidgetItem("Text0"))
self.tableWidget.setItem(0, 1, QTableWidgetItem("Text1"))
self.tableWidget.setItem(1, 0, QTableWidgetItem("Text2"))
self.tableWidget.setItem(1, 1, QTableWidgetItem("Text3"))
self.cbx = QComboBox()
self.cbx.addItems(list_text)
self.tableWidget.setCellWidget(2, 0, self.cbx)
self.dsb = QDoubleSpinBox(self)
self.dsb.setDecimals(0)
self.dsb.setMinimum(1)
self.dsb.setMaximum(100)
self.dsb.setSingleStep(1)
self.dsb.setValue(50)
self.tableWidget.setCellWidget(3, 0, self.dsb)
# table selection change
self.tableWidget.itemChanged.connect(self.on_change)
def on_change(self):
print("any item was changed. ")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
感谢您的帮助!
答案 0 :(得分:1)
当您在QCombobox
或QSpinbox
上切换内容时,您不会“更改项目”,更改“项目内容”。
因此,他们需要自己的联系:
# table selection change
self.tableWidget.itemChanged.connect(self.on_change)
# adding with this
self.dsb.valueChanged.connect(self.on_change)
self.cbx.currentTextChanged.connect(self.on_change)
如果你在基本单元格中添加一些新内容,信号会被触发,但在你的设置中,单元格中只有一个对象,根本没有变化(因为它的孩子正在这样做)。