【问题标题】:Pyqt4: pyqtSignal with keyword arguments?Pyqt4:带有关键字参数的pyqtSignal?
【发布时间】: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


【解决方案1】:

【讨论】:

  • 链接的文档没有帮助。我想将关键字参数传递给 pyqtSignal。在您的链接中,我没有看到任何示例。
  • 那么,您能否详细说明您要做什么?
  • 我添加了一个新代码。在这段代码中,您会看到我并不总是需要三个参数。有时我需要第一个或/和第三个参数。还有一点是:程序中好几个地方都用到了这个方法。而且我不想重复同样的任务两次和三次。在某些情况下,我只需要“正常”参数 - 没有两个关键字参数。还有一种情况,我只需要第三个关键字参数,以此类推。
  • @Sophus。这就是 lambdafunctools.partial 的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多