PyQt bonne utilisation de l'emit() et pyqtSignal()

Je suis de lecture par le biais de la documentation sur PyQt5 à venir avec un simple signal-slot mécanisme. Je suis venu à un arrêt dû à un facteur de conception.

Considérons le code suivant:

import sys
from PyQt5.QtCore import (Qt, pyqtSignal)
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
    QVBoxLayout, QApplication)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def printLabel(self, str):
        print(str)

    def logLabel(self, str):
        '''log to a file'''
        pass

    def initUI(self):

        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)

        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)

        self.setLayout(vbox)

        #redundant connections
        sld.valueChanged.connect(lcd.display)
        sld.valueChanged.connect(self.printLabel)
        sld.valueChanged.connect(self.logLabel)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal & slot')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

De suivre les modifications apportées à la barre, il me suffit d'imprimer et d'enregistrer les modifications apportées. Ce que je n'aime pas sur le code, c'est que je suis obligé d'appeler le sld.valueChanged fente trois fois pour envoyer la même information à 3 machines différentes.

Est-il possible de créer mon propre pyqtSignal qui envoie un nombre entier à un seul logement de fonction. Et, en retour, le logement de fonction émettent les changements qui doivent être faits?

  • Peut-être que je ne comprends pas tout à la fin de emit() car il n'y a pas de bons exemples de but dans la PyQt Signal-Slot docs. Tous nous nous sommes donné est un exemple de la façon de mettre en œuvre un emit sans paramètres.

Ce que je voudrais faire est de créer une fonction qui gère le émettent de la fonction. Considérez les points suivants:

import sys
from PyQt5.QtCore import (Qt, pyqtSignal)
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
    QVBoxLayout, QApplication)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        #create signal
        self.val_Changed = pyqtSignal(int, name='valChanged')

        self.initUI()

    def initUI(self):

        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)

        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)

        self.setLayout(vbox)

        sld.val_Changed.connect(self.handle_LCD)
        self.val_Changed.emit()

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal & slot')
        self.show()

    def handle_LCD(self, text):
        '''log'''
        print(text)
        '''connect val_Changed to lcd.display'''

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Il existe évidemment des graves défauts de conception ici. Je ne peut pas envelopper la tête autour de l'ordre des appels de fonction. Et je ne suis pas la mise en œuvre de pyqtSignal correctement. Je suis toutefois convaincu que correctement libellée 3 points va m'aider à produire une bonne application:

  1. De prédéfinir un signal: permet d'envoyer le signal vers le logement de fonction. La fente peut être réimplémentée à utiliser les valeurs du signal.
  2. Produire pyqtSignal objet avec certains paramètres. Il n'est pas encore clair quel est le but de ces paramètres sont et comment ils diffèrent des "émettent " paramètres".
  3. emit peut être réimplémentée à envoyer de signal spécifique de valeurs pour le logement de fonction. Il n'est pas encore clair pourquoi j'aurais besoin d'envoyer des différentes valeurs précédemment existante signal de méthodes.

Hésitez pas à complètement modifier le code pour ce que je suis en train de faire parce que je n'ai pas encore compris si son dans le domaine de bon style.

OriginalL'auteur Max | 2016-04-05