将信号连接到插槽的不同方法

时间:2016-05-11 05:13:08

标签: python qt pyqt signals-slots

以下代码会创建QLineEditQPushButton。按下按钮会使用当前时间更新lineedit。此功能是通过连接按钮点击'来实现的。使用update向lineedit button.clicked.connect(line.update)方法发出信号。

enter image description here

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_()

我们可以使用:{/ p>而不是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()"))

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

1 个答案:

答案 0 :(得分:2)

SIGNAL/SLOT示例都使用过时的语法。此语法仅应用于日益罕见的情况,即仍需要支持旧版本的PyQt。这意味着在引入new-style signal and slot syntax之后的4.5之前的版本。您还应该知道旧式语法不再向前兼容,因为PyQt5不再支持

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