다음 실행 코드에서 일부 키워드 인수 인 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_()
http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html는 [XY 문제]처럼 보인다 (http://xyproblem.info/). '람다 '안에있는 슬롯을 왜 부르지 않니? 신호를 내보내는 시점은 무엇입니까? – ekhumoro
내 코드를 업데이트했습니다. 내 문제를 시뮬레이트하고 싶습니다. 당신이 옳았어요,이 간단한 예제에서는 람다 내부의 슬롯을 호출 할 수는 없지만, 제 프로그램에서는 두 개의 클래스가 있습니다. 그리고 나는 데이터 캡슐화를 얻기 위해 pyqtSignal을 사용하고 싶습니다. – Sophus
신호 송신기가 연결된 슬롯의 서명을 알아야하기 때문에 데이터 캡슐화가 좋지 않은 것처럼 보입니다. 신호는 무엇이라도 듣고 있다면 알려주지 않고 (또는 배려하지 않고) 메시지를 보내는 일반 방송사 여야합니다. 메시지를 처리하는 방법을 결정하는 것은 수신자의 몫입니다. – ekhumoro