qpython3可视图形界面_PySide——Python图形化界面入门教程(三)

PySide——Python图形化界面入门教程(三)

——使用内建新号和槽

——Using Built-In Signals and Slots

上一个教程中,我们学习了如何创建和建立交互widgets,以及将他们布局的两种不同的方法。今天我们继续讨论Python/Qt应用响应用户触发的事件:信号和槽。

当用户执行一个动作——点击按钮,选择组合框的值,在文本框中打字——这个widget就会发出一个信号。这个信号自己什么都不做,它必须和槽连接起来才行。槽是一个接受信号的执行动作的对象。

连接内建PySide/PyQt信号

Qt widgets有许多的内建信号。例如,当QPushButton被点击的时候,它发出它的clicked信号。clicked信号可以被连接到一个拥有槽功能的函数(只是一个概要,需要更多内容去运行)

1 @Slot()2 defclicked_slot():3 '''This is called when the button is clicked.'''

4 print('Ouch!')5

6

7 #Create the button

8 btn = QPushButton('Sample')9

10 #Connect its clicked signal to our slot

11 btn.clicked.connect(clicked_slot)

注意@Slot()装饰(decorator)在clicked_slot()的定义上方,尽管它不是严格需要的,但它提示C++ Qt库clicked_slot应该被调用。(更多decorators的信息参见http://www.pythoncentral.io/python-decorators-overview/)我们之后会了解到@Slot宏更多的信息。现在,只要知道按钮被点击时会发出clicked信号,它会调用它连接的函数,这个函数生动的输出“Ouch!”。

我们接下来看看QPushButton发出它的三个相关信号,pressed,released和clicked。

1 importsys2 from PySide.QtCore importSlot3 from PySide.QtGui import *

4

5 #... insert the rest of the imports here

6 #Imports must precede all others ...

7

8 #Create a Qt app and a window

9 app =QApplication(sys.argv)10

11 win =QWidget()12 win.setWindowTitle('Test Window')13

14 #Create a button in the window

15 btn = QPushButton('Test', win)16

17 @Slot()18 defon_click():19 '''Tell when the button is clicked.'''

20 print('clicked')21

22 @Slot()23 defon_press():24 '''Tell when the button is pressed.'''

25 print('pressed')26

27 @Slot()28 defon_release():29 '''Tell when the button is released.'''

30 print('released')31

32 #Connect the signals to the slots

33 btn.clicked.connect(on_click)34 btn.pressed.connect(on_press)35 btn.released.connect(on_release)36

37 #Show the window and run the app

38 win.show()39 app.exec_()

当你点击应用的按钮时,它会输出

pressed

released

clicked

pressed信号是按钮被按下时发出,released信号在按钮释放时发出,最后,所有动作完成后,clicked信号被发出。

完成我们的例子程序

现在,很容易完成上一个教程创建的例子程序了。我们为LayoutExample类添加一个显示问候信息的槽方法。

@Slot()defshow_greeting(self):

self.greeting.setText('%s, %s!' %(self.salutations[self.salutation.currentIndex()],

self.recipient.text()))

我们使用recipient QLineEdit的text()方法来取回用户输入的文本,salutation QComboBox的currentIndex()方法获得用户的选择。这里同样使用Slot()修饰符来表明show_greeting将被作为槽来使用。然后,我们将按钮的clicked信号与之连接:

self.build_button.clicked.connect(self.show_greeting)

最后,例子像是这样:

ContractedBlock.gif

ExpandedBlockStart.gif

1 importsys2 from PySide.QtCore importSlot3 from PySide.QtGui import *

4

5 #Every Qt application must have one and only one QApplication object;

6 #it receives the command line arguments passed to the script, as they

7 #can be used to customize the application's appearance and behavior

8 qt_app =QApplication(sys.argv)9

10 classLayoutExample(QWidget):11 '''An example of PySide absolute positioning; the main window12 inherits from QWidget, a convenient widget for an empty window.'''

13

14 def __init__(self):15 #Initialize the object as a QWidget and

16 #set its title and minimum width

17 QWidget.__init__(self)18 self.setWindowTitle('Dynamic Greeter')19 self.setMinimumWidth(400)20

21 #Create the QVBoxLayout that lays out the whole form

22 self.layout =QVBoxLayout()23

24 #Create the form layout that manages the labeled controls

25 self.form_layout =QFormLayout()26

27 self.salutations = ['Ahoy',28 'Good day',29 'Hello',30 'Heyo',31 'Hi',32 'Salutations',33 'Wassup',34 'Yo']35

36 #Create and fill the combo box to choose the salutation

37 self.salutation =QComboBox(self)38 self.salutation.addItems(self.salutations)39 #Add it to the form layout with a label

40 self.form_layout.addRow('&Salutation:', self.salutation)41

42 #Create the entry control to specify a

43 #recipient and set its placeholder text

44 self.recipient =QLineEdit(self)45 self.recipient.setPlaceholderText("e.g. 'world' or 'Matey'")46

47 #Add it to the form layout with a label

48 self.form_layout.addRow('&Recipient:', self.recipient)49

50 #Create and add the label to show the greeting text

51 self.greeting = QLabel('', self)52 self.form_layout.addRow('Greeting:', self.greeting)53

54 #Add the form layout to the main VBox layout

55 self.layout.addLayout(self.form_layout)56

57 #Add stretch to separate the form layout from the button

58 self.layout.addStretch(1)59

60 #Create a horizontal box layout to hold the button

61 self.button_box =QHBoxLayout()62

63 #Add stretch to push the button to the far right

64 self.button_box.addStretch(1)65

66 #Create the build button with its caption

67 self.build_button = QPushButton('&Build Greeting', self)68

69 #Connect the button's clicked signal to show_greeting

70 self.build_button.clicked.connect(self.show_greeting)71

72 #Add it to the button box

73 self.button_box.addWidget(self.build_button)74

75 #Add the button box to the bottom of the main VBox layout

76 self.layout.addLayout(self.button_box)77

78 #Set the VBox layout as the window's main layout

79 self.setLayout(self.layout)80

81 @Slot()82 defshow_greeting(self):83 '''Show the constructed greeting.'''

84 self.greeting.setText('%s, %s!' %

85 (self.salutations[self.salutation.currentIndex()],86 self.recipient.text()))87

88 defrun(self):89 #Show the form

90 self.show()91 #Run the qt application

92 qt_app.exec_()93

94 #Create an instance of the application window and run it

95 app =LayoutExample()96 app.run()

View Code

运行它你会发现点击按钮可以产生问候信息了。现在我们知道了如何使用我们创建的槽去连接内建的信号,下一个教程中,我们将学习创建并连接自己的信号。

By Ascii0x03

转载请注明出处:http://www.cnblogs.com/ascii0x03/p/5499507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值