pyside / pyqt: простой способ связать несколько кнопок с одинаковыми функциями - PullRequest
2 голосов
/ 01 апреля 2012

Я новичок в PyQt / PySide.

У меня много строк редактирования (для отображения местоположения файла), и для каждой строки текста у меня есть кнопка (для отображения диалога открытия файла).

У меня есть метод:

   def selectSelf1(self): 
        """ browse for file dialog """
        myDialog = QtGui.QFileDialog
        self.lineSelf1.setText(myDialog.getOpenFileName())

и кнопка связывается с использованием следующего кода

    self.btnSelf1.clicked.connect(self.selectSelf1)

У меня около 20 из этих кнопок и 20 из этих правок. Есть ли простой способ привязать все эти кнопки к соответствующим им строкам, вместо того, чтобы печатать все?

Спасибо!

1 Ответ

5 голосов
/ 01 апреля 2012

Если у вас есть список кнопок и LineEdits, вы можете использовать следующее:

  • QSignalMapper, другое описание

  • functools.partial, например:

    def show_dialog(self, line_edit):
        ...
        line_edit.setText(...)
    
    for button, line_edit in zip(buttons, line_edits):
        button.clicked.connect(functools.partial(self.show_dialog, line_edit))
    
  • lambda

    for button, line_edit in ...: 
        button.clicked.connect(lambda : self.show_dialog(line_edit))
    

Если вы используете Qt Designer и у вас нет списка кнопок и строк, но все они имеют одинаковый шаблон именования, вы можете использовать некоторый самоанализ:

class Foo(object):
    def __init__(self):
        self.edit1 = 1
        self.edit2 = 2
        self.edit3 = 3
        self.button1 = 1
        self.button2 = 2
        self.button3 = 3

    def find_attributes(self, name_start):
        return [value for name, value in sorted(self.__dict__.items())
                          if name.startswith(name_start)]

foo = Foo()
print foo.find_attributes('edit')
print foo.find_attributes('button')
...