【问题标题】:Different ways to connect Signal to Slot将信号连接到插槽的不同方法
【发布时间】:2016-09-06 07:41:01
【问题描述】:

下面的代码创建了一个QLineEdit 和一个QPushButton。按下按钮以当前时间更新 lineedit。此功能是通过使用 button.clicked.connect(line.update) 将按钮的 'clicked' 信号连接到 lineedit 的 update 方法来实现的。

import datetime
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class LineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent=parent)

    def update(self, some=None):
        self.setText(str(datetime.datetime.now()))

line = LineEdit()
line.show()

class PushButton(QtGui.QPushButton):
    def __init__(self, parent=None):
        super(PushButton, self).__init__(parent=parent)

button = PushButton()
button.show()

button.clicked.connect(line.update)

app.exec_()

我们可以使用 button.clicked.connect(line.update) 代替:

QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), line.update)

QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), line, QtCore.SLOT("update()"))

或者,我们可以声明按钮的customSignal 并将其连接到我们需要的函数:

import datetime
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])


class LineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent=parent)

    @QtCore.pyqtSlot()
    def update(self, some=None):
        self.setText(str(datetime.datetime.now()))

line = LineEdit()
line.show()


class PushButton(QtGui.QPushButton):
    customSignal = QtCore.pyqtSignal()
    def __init__(self, parent=None):
        super(PushButton, self).__init__(parent=parent)

    def mousePressEvent(self, event):
        super(PushButton, self).mousePressEvent(event)
        self.customSignal.emit()
        event.ignore()


button = PushButton()
button.show()

button.customSignal.connect(line.update)

app.exec_()

再次,而不是使用:

button.customSignal.connect(line.update)

我们可以使用:

QtCore.QObject.connect(button, QtCore.SIGNAL('customSignal()'), line, QtCore.SLOT("update()"))

问题:使用一种方法比另一种方法有什么缺点吗?

【问题讨论】:

  • 旧语法冗长、丑陋且以字符串为中心。新的语法干净、简洁、pythonic。新语法支持旧语法所做的一切。往前走……往前走,永不回头。

标签: python qt pyqt signals-slots


【解决方案1】:

SIGNAL/SLOT 示例都使用过时的语法。这种语法应该只在仍然需要支持非常旧版本的 PyQt 的越来越少的情况下使用。这意味着 4.5 之前的版本,当时引入了 new-style signal and slot syntax。您还应该知道旧式语法不再向前兼容,因为 PyQt5 不再支持它根本

至于覆盖mouseEvent 的示例:它完全是多余的,所以我无法想象有任何通常适用的理由来偏爱它。

【讨论】:

  • 感谢您的留言!为什么为 pushButton 实现 customSignal 并覆盖其 mouseEvent 的示例被认为是多余的?
  • @spootnx。我假设您的意思是它等同于 clicked 信号(与其他示例一样)。在这种情况下,它是多余的,因为它是实现内置信号已经提供的东西的一种过于复杂的方式。当然,正如您编写的那样,代码并不是真正 等效的,因为鼠标按下与鼠标单击不同。所以自定义信号示例可以被认为是多余的错误。 (PS:你不想使用内置信号有什么具体原因吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多