2014-10-11 38 views
4

注意行redb.clicked[bool].connect(self.setColor),爲什麼它添加部分[bool]?我嘗試刪除零件,將該行修改爲redb.clicked.connect(self.setColor),結果相同。那它是什麼?區別QtGui.QPushButton.clicked [布爾]和QtGui.QPushButton.clicked

import sys 
from PyQt4 import QtGui 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     self.initUI() 

    def initUI(self):  

     self.col = QtGui.QColor(0, 0, 0)  
     redb = QtGui.QPushButton('Red', self) 
     redb.setCheckable(True) 
     redb.clicked[bool].connect(self.setColor) 
     self.square = QtGui.QFrame(self) 
     self.square.setGeometry(150, 20, 100, 100) 
     self.square.setStyleSheet("QWidget { background-color: %s }" % 
      self.col.name()) 
     self.show() 

    def setColor(self, pressed): 
     if pressed: 
      val = 255 
     else: val = 0 
     self.col.setRed(v)  
     self.square.setStyleSheet("QFrame { background-color: %s }" % 
      self.col.name())    

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()  

回答

7

在PyQt中,您可以使用它們的簽名來索引信號以選擇正確的過載。 (你的讀法正確:可以重載Qt信號,並提供具有完全不同參數的不同版本的信號)。這得到了C++的很好的支持,但是Python不直接支持重載,因此這種索引機制。

如果信號沒有超載,則不需要這樣做,索引與簽名的效果完全相同。

例子:

import sys 
from PyQt4.QtGui import * 
app = QApplication(sys.argv) 

def valueChanged(eitherIntOrString): 
    print(eitherIntOrString, type(eitherIntOrString)) 

spinbox = QSpinBox() 
spinbox.valueChanged[str].connect(valueChanged) 
spinbox.valueChanged[int].connect(valueChanged) 
spinbox.valueChanged.connect(valueChanged) 
spinbox.show() 

app.exec_() 

輸出示例:

1 <class 'str'> 
1 <class 'int'> 
1 <class 'int'> 
2 <class 'str'> 
2 <class 'int'> 
2 <class 'int'> 
3 <class 'str'> 
3 <class 'int'> 
3 <class 'int'> 

現在你理所當然地問如何PyQt的選擇默認的過載?(示例中的第三個connect())。答案是:他們在PyQt文檔中記錄了這一點。 C++ Qt文檔和PyQt文檔之間的少數差異之一。例如:http://pyqt.sourceforge.net/Docs/PyQt4/qspinbox.html#valueChanged。在我看來,默認信號始終是在C++頭文件中首先聲明的信號,但這可能並非總是如此。

信號可能過載,具有特定名稱的信號可能支持多個簽名。信號可以用簽名索引以選擇所需的信號。簽名是一系列類型。一個類型是一個Python類型對象或一個C++類型名稱的字符串。 C++類型的名稱會自動標準化,例如,可以使用QString而不是非標準化的常量QString &。

來源:http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html

+0

非常有趣!你能舉出另一個例子來說明一個人如何使用信號的「不同版本」? – 2014-10-11 16:58:50

+1

我添加了一個例子。 – dom0 2014-10-11 17:07:54