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)
最后,例子像是这样:
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