接下来这个专题介绍PyQt的一些内容

教程翻译自:

[https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm](https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm)

由于本人也是学习状态,翻译可能不准确,请及时指出,我会很快修正

一些关键字会直接使用英文

目前该专题为纯理论,实际操作在完成后有演示

PyQt版本: PyQt4

##什么是信号与槽

不像终端程序那样的顺序执行程序,GUI程序可以以事件驱动的,函数和方法可以被用来响应用户的行为,像是点击一个按钮,选择一个复选框等



每个PyQt Widget(由QObject 类继承而来)可以被用作于这些事件的源,即发出一个或多个'信号'(signal),譬如点击,勾选



信号本身并不会做任何的动作,它会和一个槽(Slot)进行连接,槽可以调用Python程序.


## 如何连接

我们有如下2个方式进行Signal和Slot的连接

```
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
```

```
widget.signal.connect(slot_function)
```

这里我们假设当我们点击(clicked)一个按钮(button)是触发一个函数(slot_function)

--------

可以有如下两种写法

```
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

button.clicked.connect(slot_function)
```


##连接案例

我们假设有b1 b2 两个 QPushButton 在QDialog窗体上,当我们点击b1 b2两个按钮时调用b1_clicked() 和 b2_clicked()两个函数

我们可以这么写

```
b1.clicked.connect(b1_clicked())
When b2 is clicked, the clicked() signal is connected to b2_clicked() function

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
```

全部代码如下

```
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()
```

## 执行结果


执行和如下图:


[image:139 size:orig]



点击按钮后输出

```
Button 1 clicked
Button 2 clicked
```