PyQt在信号之后多次执行我的函数

时间:2017-09-15 15:59:23

标签: python pyqt signals slots

我正在使用多个QcomboBox构建一个pyqt Qwidget,用户可以随意添加项目。但我也希望通过单击QPush按钮为用户提供删除任何项目的选项。

因为我无法事先知道用户想要删除哪个comboBox和项目,所以我创建了一个事件过滤器来查找正在激活的对象以及正在选择的项目。

下面的代码按预期工作,但函数printevent的调用次数越来越多,这最终会使我的程序变慢。

我试图定义@QtCore.pyqtSlot()无济于事。

我做错了什么?

我的代码(对于此示例,我只显示其中一个ComboBox):

from PyQt4 import QtCore, QtGui
import sys, os, json

class Ui_MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Ui_MainWindow,self).__init__(parent=parent)

        ### MAIN WINDOW ####
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(1016, 790)
        MainWindow.move(200,30)

        self.centralwidget = QtGui.QWidget()

        self.gridLayout_2 = QtGui.QGridLayout()
        self.gridLayout_2.setVerticalSpacing(0)
        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))

        self.comboBox_nationality = QtGui.QComboBox(self.centralwidget)
        self.comboBox_nationality.setEditable(True)
        self.gridLayout_2.addWidget(self.comboBox_nationality, 1, 0, 1, 1)

        self.comboBox_nationality.installEventFilter(self)

    def eventFilter(self,obj, event):
        if  event.type() == QtCore.QEvent.FocusIn:
            objt=str(obj.objectName())

            exec('self.' + objt + '.activated[str].connect(self.printevent)')
        return super(Ui_MainWindow,self).eventFilter(obj,event)

    @QtCore.pyqtSlot(QtCore.QString) # Doesn't change anything 
    @QtCore.pyqtSlot() # TypeError: printevent() takes exactly 2 arguments (1 given)   

    def printevent(self,item):
        print item


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ex = Ui_MainWindow()
    ex.__init__(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

0 个答案:

没有答案