декоратор на слоте (PyQt) - PullRequest
0 голосов
/ 08 мая 2018

Я использую QT для создания моего графического интерфейса и декоратор для записи журнала. Когда я использую декоратор в слоте, графический интерфейс сокрушается.

Код:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


def LogInfos(func):

    def wrapper(*s, **gs):
        print('log')
        ret = func(*s, **gs)
        return ret

    return wrapper
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        btn = QPushButton('test')
        layout.addWidget(btn)
        btn.clicked.connect(self.testSlot)

    @LogInfos
    def testSlot(self):
        print('test slot')


@LogInfos
def testLog():
    print('test log')

if __name__ == '__main__':

    testLog()

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Я проверил, что функция декоратора в порядке, а графический интерфейс в порядке после удаления декоратора.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Попробуйте: btn.clicked.connect (lambda: self.testSlot ())

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


def LogInfos(func):

    def wrapper(*s, **gs):
        print('log')
        ret = func(*s, **gs)
        return ret

    return wrapper
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        btn = QPushButton('test')
        layout.addWidget(btn)
        #btn.clicked.connect(self.testSlot)
        btn.clicked.connect(lambda: self.testSlot())         

    @LogInfos
    def testSlot(self):
        print('test slot')


@LogInfos
def testLog():
    print('test log')

if __name__ == '__main__':

    testLog()

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

enter image description here

0 голосов
/ 08 мая 2018

См. Объяснение @ ekhumoro, почему, но использование декорированного метода в слоте приводит к вашей проблеме из-за неверной подписи.

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


def LogInfos(func):

    def wrapper(*s, **gs):
        print('log')
        ret = func(*s, **gs)
        return ret

    return wrapper
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        btn = QPushButton('test')
        layout.addWidget(btn)
        btn.clicked.connect(self.testSlot)

    @LogInfos
    def testSlot(self, checked=False):
        print('test slot')


@LogInfos
def testLog():
    print('test log')

if __name__ == '__main__':

    testLog()

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
...