Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 PyQt5:如何使用QComboBox从QTableWidget获取信号?_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python PyQt5:如何使用QComboBox从QTableWidget获取信号?

Python PyQt5:如何使用QComboBox从QTableWidget获取信号?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我知道这是一个初学者的问题,我搜索了一下,但没有找到答案 在应用程序中有一个QTableWidget,它包含一个QComboBox、一个QDoubleSpinBox和一些常规项目 通过更改任何单元格,我希望激活“更改”上的方法并打印一些内容 下面的代码不接收来自QComboBox和QDoubleSpinBox的更改信号。我怎样才能更正代码 import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.Q

我知道这是一个初学者的问题,我搜索了一下,但没有找到答案

在应用程序中有一个QTableWidget,它包含一个QComboBox、一个QDoubleSpinBox和一些常规项目

通过更改任何单元格,我希望激活“更改”上的方法并打印一些内容

下面的代码不接收来自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_())

谢谢你的帮助

在QCOMBOX或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)

如果在基本单元格中添加新的内容,信号会被触发,但在您的设置中,单元格中只有一个对象,它根本不会改变,因为它的子单元格正在这样做。

也许可以尝试将QComboBox和QComboBox小部件连接到您想要的插槽。类似于self.cbx.currentIndexChanged.connectself.on\u change的内容。不过,您必须小心关于_change的函数的参数类型。@GergesDib感谢您的帮助。这与你的方法是一致的。然而,我实际上更喜欢直接从QTableWidget生成信号,因为我的应用程序非常复杂-在这种情况下,最好使用qtableview并构建自己的模型/委托。还有一些讨论@LucasMeier。对单元格小部件的更改不会更改单元格项,因此从来没有任何理由发出itemChanged信号,对所有其他表小部件信号也是如此。项目委托可能是您所需要的,因为它们可以直接更新项目数据,从而避免需要来自单元格小部件的中间信号。