【问题标题】:Pyqt5 QtableWidget and integrated combobox fails to call a function when combobox items changePyqt5 QtableWidget和集成的组合框在组合框项目更改时无法调用函数
【发布时间】:2018-05-01 02:37:38
【问题描述】:

我有以下代码:

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class tabdemo(QMainWindow):
    def __init__(self):
        super(tabdemo, self).__init__()
        self.setGeometry(50,50,500,500)
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.table()
        self.mainHBOX_param_scene = QHBoxLayout()
        self.mainHBOX_param_scene.addWidget(self.tableWidget)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)


    def table(self):

        self.tableWidget = QTableWidget() 
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setRowCount(5)

        attr = ['one', 'two', 'three', 'four', 'five']
        i = 0
        for j in attr:
            self.tableWidget.setItem(i, 0, QTableWidgetItem(j))
            combobox = QComboBox()
            for txt in ["Sinus","Triangle","Square"]:
                combobox.addItem(txt)
            self.tableWidget.setCellWidget(i, 1, combobox)
            i += 1

        self.tableWidget.itemChanged.connect(self.Table_itemchanged)

    def Table_itemchanged(self):
        print('Changed')

def main():
   app = QApplication(sys.argv)
   ex = tabdemo()
   ex.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   main()

它只是放置一个 Qtablewidget,其中一列是标签,另一列是组合框。 我想要做的是当我修改任何组合框的值时,我想调用一个函数,在这种情况下,在控制台中打印“已更改”。 当我编辑 QtableWidget 的标签部分时,信号连接self.tableWidget.itemChanged.connect(self.Table_itemchanged) 工作正常,但是当我修改组合框项时它失败了。

有没有人可以解释我为什么以及是否存在解决我的问题的方法。 谢谢大家。

【问题讨论】:

    标签: python combobox pyqt signals qtablewidget


    【解决方案1】:

    使用组合框的currentIndexChanged 信号。

    您可以在组合框上设置一个属性来存储和恢复它所属的行(和列,如果需要)。

        for j in attr:
            self.tableWidget.setItem(i, 0, QTableWidgetItem(j))
            combobox = QComboBox()
            for txt in ["Sinus","Triangle","Square"]:
                combobox.addItem(txt)
            combobox.setProperty('row', i)
            combobox.currentIndexChanged.connect(self.Combo_indexchanged)
            self.tableWidget.setCellWidget(i, 1, combobox)
            i += 1
    

    并添加一个新插槽:

    def Combo_indexchanged(self):
        combo = self.sender()
        row = combo.property('row')
        index = combo.currentIndex()
        print('combo row %d indexChanged to %d' % (row, index))
    

    【讨论】:

    • 好的,我明白了。这样可行。我想知道为什么我没有想到这一点。非常感谢。
    • 是否可以直接将组合框发送到用connect调用的函数?喜欢combobox.currentIndexChanged.connect(lambda x=combobox: self.Table_itemchanged(x)) ?我试过了,但似乎不对。
    • 我的错。我忘记将状态放入 lambda 函数中:combobox.currentIndexChanged.connect(lambda state,x=combobox: self.Table_itemchanged(x))
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2011-04-12
    • 2011-08-17
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多