2017-02-08 3 views
0

다음 실행 코드에서 일부 키워드 인수 인 pyqtSignal()을 전달하려고합니다. 키워드 인수가 없으면 작동합니다. 자, pyqtSignal()은 키워드 인수를 지원하지 않습니다. 따라서이 문제를 해결할 아이디어가 없다는 것을 인정해야합니다. 하지만 구현 세부 사항을 피하고 싶습니다.Pyqt4 : 키워드 인수가있는 pyqtSignal?

몇 가지 제안이나 대안이 있습니까?

from sys import argv 

from PyQt4.QtCore import Qt, pyqtSignal 

from PyQt4.QtGui import QDialog, QApplication, QPushButton, \ 
    QFormLayout, QTextEdit 

class Form(QDialog): 

    test_signal = pyqtSignal() 

    def __init__(self, parent=None): 
     QDialog.__init__(self, parent) 

     self.test_signal.connect(self.print_it) 

     self.init_ui() 

    def init_ui(self): 


     self.pushButton_pyqt_signal = QPushButton() 
     self.pushButton_pyqt_signal.setText("pyqtSignal") 

     layout = QFormLayout() 
     layout.addWidget(self.pushButton_pyqt_signal) 

     self.setLayout(layout) 
     self.setWindowTitle("Log In") 

     self.pushButton_pyqt_signal.clicked.connect(lambda: self.test_signal.emit('normal argument', keyword_arg_second='Ok, second')) 

    def print_it(self, argument, keyword_arg_first=None, keyword_arg_second=None): 
     print "Do some with argument", argument 
     print "Do some with first keyword:", keyword_arg_first 
     print "Do some with second keyword", keyword_arg_second 
     return 

app = QApplication(argv) 
form = Form() 
form.show() 
app.exec_() 

업데이트 # 1

from sys import argv 

from PyQt4.QtCore import Qt, pyqtSignal, QObject 

from PyQt4.QtGui import QDialog, QApplication, QPushButton, \ 
    QFormLayout 

class WorkClass(QObject): 

    test_signal = pyqtSignal(object) 

    def __init__(self, parent=None): 
     QObject.__init__(self, parent) 

    def run(self): 
     self.test_signal.emit(self.test_signal.emit('normal argument', keyword_arg_second="Ok, second")) 

class Form(QDialog): 

    start_work_class_signal = pyqtSignal() 

    def __init__(self, parent=None): 
     QDialog.__init__(self, parent) 

     self.init_ui() 

    def init_ui(self): 


     self.pushButton_pyqt_signal = QPushButton() 
     self.pushButton_pyqt_signal.setText("pyqtSignal") 

     layout = QFormLayout() 
     layout.addWidget(self.pushButton_pyqt_signal) 

     self.setLayout(layout) 
     self.setWindowTitle("Testing window") 

     self.pushButton_pyqt_signal.clicked.connect(self.start_with_work) 

    def print_it(self, argument, keyword_arg_first=None, keyword_arg_second=None): 
     print "argument", argument 
     print "See first:", keyword_arg_first 
     print "See second", keyword_arg_second 
     return 

    def start_with_work(self): 
     work_class = WorkClass() 
     work_class.test_signal.connect(self.print_it) 

     self.start_work_class_signal.connect(work_class.run) 
     self.start_work_class_signal.emit() 

app = QApplication(argv) 
form = Form() 
form.show() 
app.exec_() 
+0

http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html는 [XY 문제]처럼 보인다 (http://xyproblem.info/). '람다 '안에있는 슬롯을 왜 부르지 않니? 신호를 내보내는 시점은 무엇입니까? – ekhumoro

+0

내 코드를 업데이트했습니다. 내 문제를 시뮬레이트하고 싶습니다. 당신이 옳았어요,이 간단한 예제에서는 람다 내부의 슬롯을 호출 할 수는 없지만, 제 프로그램에서는 두 개의 클래스가 있습니다. 그리고 나는 데이터 캡슐화를 얻기 위해 pyqtSignal을 사용하고 싶습니다. – Sophus

+0

신호 송신기가 연결된 슬롯의 서명을 알아야하기 때문에 데이터 캡슐화가 좋지 않은 것처럼 보입니다. 신호는 무엇이라도 듣고 있다면 알려주지 않고 (또는 배려하지 않고) 메시지를 보내는 일반 방송사 여야합니다. 메시지를 처리하는 방법을 결정하는 것은 수신자의 몫입니다. – ekhumoro

답변

0

도움이 될 수 있습니다, 워드 프로세서를 살펴 보자 :

+0

링크 된 문서가 도움이되지 않습니다. pyqtSignal 키워드 인수를 전달하고 싶습니다. 당신의 연결에서 나는 아무보기도 보지 않는다. – Sophus

+0

그러면,하고 싶은 일에 대해 좀 더 자세히 설명해 주시겠습니까? – AlOrozco53

+0

새 코드를 추가했습니다. 이 코드에서는 항상 세 가지 인수가 필요한 것은 아닙니다. 때로는 첫 번째 및/또는 세 번째 인수가 필요합니다. 그리고 다른 점은 프로그램의 몇 곳에서이 방법이 사용된다는 것입니다. 그리고 같은 작업을 2 ~ 3 번 반복하고 싶지는 않습니다. 어떤 상황에서는 두 개의 키워드 인수없이 '일반적인'인수 만 필요합니다. 그리고 상황이 있습니다. 저는 세 번째 키워드 인수 만 필요합니다. – Sophus