【发布时间】:2017-02-08 21:37:48
【问题描述】:
在下面的可执行代码中,我将传递一些关键字参数pyqtSignal()。如果没有关键字参数,它确实有效。好吧,我知道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_()
【问题讨论】:
-
看起来像XY Problem。为什么不直接调用
lambda内的槽?发出信号有什么意义? -
我已经更新了我的代码。我想模拟我的问题。你是对的,在这个简单的例子中我不能只调用 lambda 中的插槽,但是在我的程序中我有两个类,我想使用 pyqtSignal 来获取数据封装。
-
这看起来像是糟糕的数据封装,因为信号发射器必须知道与其连接的插槽的签名。信号应该是通用的广播器,可以在不知道(或关心)是否有任何东西在听它们的情况下发送消息。由接收者决定如何处理这些消息。
标签: python-2.7 qt4 pyqt4