Источник распознавания события в PyQT - PullRequest
1 голос
/ 27 мая 2010

Я начинаю с PyQt4 и сейчас у меня проблема с событиями.

У меня есть один основной класс, скажем, MainWindow. MainWindow имеет список кнопок типа ButtonX (форма наследования QPushButton). Я хотел бы достичь одного из 2 решений (зависит от того, что проще).

1) После нажатия одной из кнопок в списке я бы хотел запустить один метод MainWindow. Я хотел бы иметь возможность прочитать источник события там (распознать нажатую кнопку)

2) Второе решение - запустить метод, определенный в классе ButtonX.

То, что я пробовал, это:

QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0).buttonMethod())

QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0), QtCore.SLOT("incrementValue()"))

и даже эта строка вызывает приостановку интерпретатора Python

QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0), QtCore.SLOT("incrementValue"))

1 Ответ

4 голосов
/ 27 мая 2010

1) После нажатия одной из кнопок в списке я бы хотел запустить один метод MainWindow. Я хотел бы иметь возможность прочитать источник события там (распознать нажатую кнопку)

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

2) Второе решение - запустить метод, определенный в классе ButtonX.

Посмотрите внимательно на то, что вы ввели для последнего аргумента первого вызова подключения:

self.getButton(0, 0).buttonMethod()

Выше будет оцениваться getButton с параметрами 0, 0, а затем для этого объекта вызовет метод buttonMethod. Поэтому, если buttonMethod не возвращает метод, вы используете возвращаемое значение buttonMethod в качестве последнего параметра для вызова подключения. Если этот метод возвращает функцию, это нормально.

Скорее, я бы ожидал увидеть что-то вроде следующего:

self.getButton(0, 0).buttonMethod # note no parenthesis at end

Взгляните на каталог примеров PyQt, поставляемый с PyQt, так как они продемонстрируют точный синтаксис и послужат хорошим примером.

Вот один маленький пример:

class MW(QMainWindow):
    def __init__(self, *args)
        QMainWindow.__init__(self, *args)
        layout = QHBoxLayout(self)
        self.b1 = QPushButton("Button1")
        self.b2 = QPushButton("Button2")
        layout.addWidget(self.b1)
        layout.addWidget(self.b2)
        self.connect(self.b1, SIGNAL("clicked()"), self.buttonWasPressed)
        self.connect(self.b2, SIGNAL("clicked()"), self.buttonWasPressed)

    def buttonWasPressed(self):
        print "button %s was pressed" % self.sender()
...