PyQt在签名后多次执行我的函数

2024-10-03 15:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个带有多个QcomboBox的pyqt Qwidget,用户可以在其中随意添加项。但是我还想让用户通过单击QPushbutton来删除任何项目。在

我不想在被选中的事件中找到被激活的对象,因为我不想在这个组合框中找到被选中的项目。在

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

我试图定义@QtCore.pyqtSlot(),但没有成功。在

我做错什么了?在

我的代码(对于本例,我只显示其中一个组合框):

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_())

Tags: selfobjuiinitdefsysparentnationality