PyQt: Comment connecter QComboBox de fonction avec des Arguments

QComboBox est associé à une fonction en utilisant la syntaxe suivante:

myComboBox.activated.connect(self.myFunction )

Mais j'ai besoin d'être en mesure d'envoyer les arguments de la zone de liste déroulante à myFunction(). Mais si j'utilise:

myComboBox.activated.connect(self.myFunction(myArg1, myArg2 )

Je suis

TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'

Ce que la syntaxe doit être utilisé pour connecter un QComboBox à une fonction qui est capable de recevoir des arguments envoyés à partir de Comobobox?

ÉDITÉ PLUS TARD:

Voici le code résultant d'une erreur TypeError:

connect() slot argument should be a callable or a signal, not 'NoneType'


from PyQt4 import QtCore, QtGui
import sys

class MyClass(object):
    def __init__(self, arg):
        super(MyClass, self).__init__()
        self.arg = arg        

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

        self.comboBox = QtGui.QComboBox(self)
        self.comboBox.addItems([str(x) for x in range(3)])

        self.myObject=MyClass(id(self) )

        self.comboBox.activated.connect(self.myFunction(self.myObject, 'someArg'))

    def myFunction(self, arg1=None, arg2=None):
        print '\n\t myFunction(): ', type(arg1),type(arg2)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myApp')
    dialog = myWindow()
    dialog.show()
    sys.exit(app.exec_())
  • double possible de Créer un bouton dynamique en PyQt
  • Regarder prendre votre code et de modifier self.comboBox.activated.connect(self.myFunction(self.myObject, 'someArg')) par self.comboBox.activated.connect(self.myFunction) il fonctionne parfaitement pour moi. Comme je l'ai dit, vous n'avez pas besoin de spécifier les arguments lors de la connexion de la fente.
  • J'ai besoin de spécifier les arguments lors de la connexion de la fente. Si je n'ai pas de spécifier les arguments lors de la connexion de la fente comment je pourrais être en mesure d'envoyer les arguments de la fonction? Il est très simple si il n'y aurait pas besoin d'arguments pour envoyé. Mais dans ce cas, les arguments doivent être spécifiés lors de la connexion de la fente.
  • Je pense que vous avez mal compris la façon dont les signaux et les slots œuvres. Vous ne POUVEZ PAS envoyer arbitraire types d'arguments sur un signal spécifique. Le signal activate de QComboBox est rependu avec un int voir: pyqt.sourceforge.net/Docs/PyQt4/qcombobox.html#activated. Donc, vous devez définir vous-mêmes des signaux, un signal qui émettent que des types de valeur que vous voulez (MyClass pour l'auto.myObject et str pour someArg). Et puis vous pouvez émettent votre signal à partir de la fonction qui gère activate événement. et bien sûr, vous-mêmes des signaux a besoin d'un maître-chien/logement trop.
  • Le haut-signaux de savoir (c'est prédéfinie) combien et quelle types d'arguments vont être envoyés aux machines à sous. La seule chose que vous avez à faire est de mettre en œuvre un logement prêt à recevoir de tels arguments. Si le signal n'est pas traite avec le type d'arguments que vous avez besoin, et bien, encore une fois, vous avez besoin d'un signal personnalisé.
  • D'accord avec votre point de vue. Mais si le Signal personnalisé + Fente n'est pas l'option, puis lambda est la réponse à une telle situation (quand il y a un besoin d'envoyer des arguments à la fonction).
  • Il serait intéressant de voir comment un Signal personnalisé/Logement et de leur connexion à l'arbitraire widget de tous pourrait être atteint. Veuillez poster quelques exemple simplifié. Et la capacité à envoyer les arguments vers le bas pour fonction serait un bonus.
  • tout en essayant de passer des arguments à myFunction vous l'avez appelé alors None est transmis à connect au lieu de myFunction lui-même. La solution a été de placer l'appel avec un ad hoc de la fonction et de la transmettre à la place: lambda: self.myFunction(self.myObject, 'someArg'). C'est assez standard façon de résoudre ce problème. Vous souhaitez faire de la même façon par exemple tkinter

InformationsquelleAutor alphanumeric | 2014-04-16