2016-05-11 89 views
0

以下代碼創建一個QLineEditQPushButton。按下按鈕更新lineedit與當前時間。通過將按鈕的「單擊」信號連接到lineedit的update方法,使用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_() 

而不是使用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()"))

或者我們可以decla重新按鈕的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

舊的語法是冗長的,醜陋的和以字符串爲中心的。新的語法是乾淨,簡潔和pythonic。新的語法支持舊的語法。前進...前進,永不回頭。 –

回答

2

SIGNAL/SLOT示例都使用過時的語法。這種語法只能用於日益罕見的情況,即PyQt的老版本仍需要支持。這意味着版本早於4.5,當時引入了new-style signal and slot syntax。您還應該意識到舊式語法不再向前兼容,因爲PyQt5不再支持,所有都不支持。

至於覆蓋mouseEvent的例子:它是完全多餘的,所以我無法想象有任何一般適用的理由更喜歡它。

+0

感謝您的留言!爲什麼會爲pushButton實現一個'customSignal'並重寫它的'mouseEvent'被認爲是多餘的? – alphanumeric

+0

@spootnx。我認爲你的意思是相當於'clicked'信號(就像其他的例子)。在這種情況下,這是多餘的,因爲這是一種過度複雜的方式來實現已經由內置信號提供的東西。當然,正如你寫的那樣,代碼不是*真的*等價的,因爲鼠標按鍵與鼠標點擊不同。所以自定義信號示例可以被認爲是冗餘*和*越野車。 (PS:是否有一個特定的原因,您不想使用內置信號?) – ekhumoro