将信号连接到插槽的不同方式
Different ways to connect Signal to Slot
下面的代码创建了一个 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()"))
问题:使用一种方法优于另一种方法有什么缺点吗?
SIGNAL/SLOT
示例全部使用过时的语法。这种语法应该只在越来越少见的情况下使用,在这些情况下仍然需要支持非常旧的 PyQt 版本。这意味着 4.5 之前的版本,当 new-style signal and slot syntax 被引入时。您还应该知道旧式语法不再向前兼容,因为 PyQt5 不再支持它完全。
至于覆盖 mouseEvent
的示例:它完全是多余的,所以我无法想象有任何 通常 更喜欢它的适用理由。
下面的代码创建了一个 QLineEdit
和一个 QPushButton
。按下按钮更新 lineedit 为当前时间。此功能是通过使用 button.clicked.connect(line.update)
.
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()"))
问题:使用一种方法优于另一种方法有什么缺点吗?
SIGNAL/SLOT
示例全部使用过时的语法。这种语法应该只在越来越少见的情况下使用,在这些情况下仍然需要支持非常旧的 PyQt 版本。这意味着 4.5 之前的版本,当 new-style signal and slot syntax 被引入时。您还应该知道旧式语法不再向前兼容,因为 PyQt5 不再支持它完全。
至于覆盖 mouseEvent
的示例:它完全是多余的,所以我无法想象有任何 通常 更喜欢它的适用理由。