PyQt - слоты с параметром - PullRequest
       16

PyQt - слоты с параметром

2 голосов
/ 10 января 2011

Пример:

У меня три кнопки, все почти одинаковые. Я хочу иметь только 1 слот-функцию для всех 3 кнопок.

def slotButtons(nr_button):

  #common part

  if(nr==1):
    #for button 1
  else if(nr==2):
    #for button 2
  else if(nr==3):
    #for button 3

  #common part 

Так что мне нужно что-то вроде слотов с параметром ..

QtCore.QObject.connect(pushButton1, QtCore.SIGNAL("clicked()"), slotButtons(1))
QtCore.QObject.connect(pushButton2, QtCore.SIGNAL("clicked()"), slotButtons(2))
QtCore.QObject.connect(pushButton3, QtCore.SIGNAL("clicked()"), slotButtons(3))

Может ли Python (pyQt) сделать что-то такое?

Ответы [ 5 ]

5 голосов
/ 10 января 2011

Что нужно connect, так это любой вызываемый объект Python.Поскольку Python имеет функции в качестве объектов первого класса, это легко реализовать с помощью функции-оболочки.Для простых случаев lambda будет делать:

    self.connect(pyuic4Button, SIGNAL("clicked()"),
            lambda: self.setPath("pyuic4"))
    self.connect(pyrcc4Button, SIGNAL("clicked()"),
            lambda: self.setPath("pyrcc4"))
1 голос
/ 10 января 2011

Вы можете использовать функцию QObject::sender(), чтобы вести себя по-разному для каждого отправителя, объекта, подробнее см. Документация QObject .

0 голосов
/ 26 июня 2016

Вы даже можете сделать:

lambda value: self.doStuff(True if value==True else False)

Это довольно хороший инструмент, когда вы поймете, как он работает.

Редактировать: Вы также можете пропустить все операции if / else ... Просто перейдите прямо к точке ... - грубый пример:

btn_01 = lambda: self.doStuff("C://")
btn_02 = lambda: self.doStuff("D://")

def doStuff(self,dir):
     saveFile(dir+"filename.txt")
0 голосов
/ 10 января 2011

Вы можете иметь переменную-член для идентификации объекта и сделать что-то вроде следующего:

def slotButtons(btn):
    if btn.who_are_you == 1:
        # Do some stuff
    elif btn.who_are_you == 2:
        # Do some stuff
    elif btn.who_are_you == 3:
        # Do some stuff

    # Common part
0 голосов
/ 10 января 2011

Я не использую PyQt, но взгляните на документацию QSignalMapper, она должна быть такой же. По сути, он позволяет отображать сигналы, поступающие от разных объектов, в слот с параметром.

...