Проблема с СИГНАЛОМ - SLOT, aboutToQuit () - PullRequest
2 голосов
/ 29 июня 2011

Мое приложение закрывается, только если щелкнуть правой кнопкой мыши значок в трее и нажать «Выйти»:

class DialogUIAg(QDialog):
    ...
    self.quitAction = QAction("&Quit", self, triggered=qApp.quit)

Модуль ниже является отправной точкой приложения:

#!/usr/bin/env python

import imgAg_rc
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import appLogger

from runUIAg import *

class Klose:
    """ Not sure if i need a Class for it to work"""
    def closingStuff(self):
        print("bye")

@pyqtSlot()
def noClassMethod():
    print("bye-bye")

app = QApplication(sys.argv)
QApplication.setQuitOnLastWindowClosed(False)

k = Klose()
app.connect(app, SIGNAL("aboutToQuit()"), k,SLOT("closingStuff()")) #ERROR

app.connect(app, SIGNAL("aboutToQuit()"), k.closingStuff)   # Old-Style
app.connect(app, SIGNAL("aboutToQuit()"), noClassMethod)    # Old-Style

app.aboutToQuit.connect(k.closingStuff)   # New-Style
app.aboutToQuit.connect(noClassMethod)    # New-Style

winUIAg = DialogUIAg()
winUIAg.show()
app.exec_()

Мое намерениедолжен выполнить блок кода, когда приложение aboutToQuit.
Это ошибка, которую я получаю:

$ ./rsAg.py
Traceback (most recent call last):
  File "./rsAgent.py", line 20, in <module>
    app.connect(app, SIGNAL("aboutToQuit()"), k,SLOT("closingStuff()"))
TypeError: arguments did not match any overloaded call:
  QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'Klose'
  QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'Klose'
  QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'Klose'

Я новичок в Python и Qt, и я был бы признателен за вашу помощь.


РЕДАКТИРОВАТЬ:

  • Я забыл упомянуть версии (python: 3.2, pyQt: 4.8.4)
  • Нам не нужен класс для определенияСлот.Слотом может быть любой метод, используя декоратор @pyqtSlot().
  • Я добавил noClassMethod () в коде.
  • @ Мэт, твое предложение помогло мне пойти дальше.Теперь я нашел 3 других способа сделать это.Я думаю, это примерно старый стиль против нового стиля .
  • Я не буду удалять сообщение об ошибке для возможных будущих читателей.

Спасибо всем: -)

Ответы [ 2 ]

5 голосов
/ 29 июня 2011

Синтаксис сигнала / слота PyQt не полностью идентичен синтаксису C ++.

Попробуйте с:

class Klose:
  def closingStuff(self):
    print("bye")

...
app.connect(app, SIGNAL("aboutToQuit()"), k.closingStuff)

Не уверен, что это необходимо в PyQt, но обычно ожидается, что сигналы и слоты будут приходить от / идти к объектам QObject. Сигналы и слоты нового стиля могут представлять интерес, если ваша версия PyQt достаточно свежая.

0 голосов
/ 10 февраля 2014

В PyQt5 сигнал нового стиля: app.aboutToQuit.connect (...)

def app_aboutToQuit():
    print('app_aboutToQuit()')

app = QtWidgets.QApplication(sys.argv)
app.aboutToQuit.connect(app_aboutToQuit) 
...