Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PySide——Python图形化界面入门教程(三)

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

作者头像
ascii0x03
发布于 2018-04-12 04:29:30
发布于 2018-04-12 04:29:30
2K00
代码可运行
举报
运行总次数:0
代码可运行

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

         ——使用内建新号和槽

              ——Using Built-In Signals and Slots

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

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

连接内建PySide/PyQt信号

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 @Slot()
 2 def clicked_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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 import sys
 2 from PySide.QtCore import Slot
 3 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 def on_click():
19     ''' Tell when the button is clicked. '''
20     print('clicked')
21  
22 @Slot()
23 def on_press():
24     ''' Tell when the button is pressed. '''
25     print('pressed')
26  
27 @Slot()
28 def on_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_()

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pressed
released
clicked

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

完成我们的例子程序

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slot()
def show_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信号与之连接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.build_button.clicked.connect(self.show_greeting)

最后,例子像是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 import sys
 2 from PySide.QtCore import Slot
 3 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 class LayoutExample(QWidget):
11     ''' An example of PySide absolute positioning; the main window
12         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     def show_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     def run(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()

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PySide——Python图形化界面入门教程(二)
PySide——Python图形化界面入门教程(二)   ——交互Widget和布局容器                ——Interactive Widgets and Layout Containers 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-interactive-widgets-and-layout-containers/ 上一个教程中,我们了解了一些QWidget提供的功能,还有一个特殊的子类QLabel。更进一步的,我们完成了一个用来说
ascii0x03
2018/04/12
2.7K0
PySide——Python图形化界面入门教程(二)
PySide6 GUI 编程(3):信号槽机制
信号的重载在 PySide6 中并不推荐使用,对于从 QT5 遗留的代码可以继续使用这一能力。
bowenerchen
2024/05/19
6291
PySide6 GUI 编程(3):信号槽机制
PySide6 GUI 编程(4):使用 Slot 装饰器定义槽函数
bowenerchen
2024/05/20
5891
PySide6 GUI 编程(4):使用 Slot 装饰器定义槽函数
基于PySide6的GUI程序开发全流程(看完就会)
GUI程序的开发方式太多了,这里肯定就是Python语言了,至于为什么,就不多描述了;
MinChess
2023/09/29
14.5K0
基于PySide6的GUI程序开发全流程(看完就会)
PySide6 GUI 编程(38):信号拦截与 lambda 槽函数
在之前的文章:PySide6 GUI 编程(3):信号槽机制中已经探讨过关于自定义信号的场景。在一些更追求灵活性的场景下,我们需要自定义信号,以此触发更多自定义的行为。
bowenerchen
2024/08/31
9770
PySide6 GUI 编程(38):信号拦截与 lambda 槽函数
PySide——Python图形化界面入门教程(六)
PySide——Python图形化界面入门教程(六)             ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/ 上一个教程中,我们讨论了Qt的QListWidget类,它用来实现简单的单列列表框(list boxes)。然而,我们还需要更加灵活的widget来实现列表,Qt为此提供了QListView 来实现多种多样
ascii0x03
2018/04/12
2.2K0
PySide——Python图形化界面入门教程(六)
事件与信号
所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。调用应用的exec_()方法时,应用会进入主循环,主循环会监听和分发事件。
小飞侠xp
2018/12/24
1.3K0
PySide6 GUI 编程(6):QPushButton的使用
bowenerchen
2024/07/20
4662
PySide6 GUI 编程(6):QPushButton的使用
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
PyQt5 是 Python 的图形用户界面 (GUI) 框架,它基于强大的 Qt 库。Qt 是一个跨平台的 C++ 框架,用于构建桌面应用程序。通过 PyQt5,我们可以用 Python 轻松构建跨平台的桌面应用程序,支持 Windows、macOS 和 Linux。
半截诗
2024/10/09
21.6K0
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五)               ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistwidget/ Qt具有简洁和方便的几个部件,用来作单列表选择,我们称之为列表框。最灵活的方法是使用一个是Qlistview,它提供了一个必须由程序员定义UI视图、高度灵活的列表模式;一个简单的方法是使用QListWidget,它具有一个预先定义的基于项目的模型,用来处理常见的列表框。
ascii0x03
2018/04/12
1.9K0
PySide——Python图形化界面入门教程(五)
PyQt5 基本窗口控件(状态栏/窗口/图标/提示消息/QLabel/文本类控件)
文章目录 1. 状态栏 2. 窗口居中显示 3. 关闭窗口 4. QWidget 5. 添加图标 6. 气泡提示信息 7. QLabel 添加快捷键 8. QLineEdit echoMode 验证器 inputMask 综合练习 9. QTextEdit learn from 《PyQt5 快速开发与实战》 1. 状态栏 self.statusbar.showMessage("hello, Michael", 2000),第二个参数是显示多长时间ms,默认无限长时间 # -*- coding: utf-8
Michael阿明
2022/05/10
2.6K0
PyQt5 基本窗口控件(状态栏/窗口/图标/提示消息/QLabel/文本类控件)
Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
在开发程序时,如果这个程序只有一个窗口,则应该关心这个窗口里面的各个控件之间是如何传递数据的。如果这个程序有多个窗口,那么还应该关心不同的窗口之间是如何传递数据的。
不脱发的程序猿
2021/12/08
3.4K0
Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
PySide——Python图形化界面入门教程(一)
PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-widgets-and-hello-world/ 本教程第一部分将给出PySide的最基本知识点,包含使用的对象,和一些能帮助你了解Python/Qt应用是如何构建的小例子。 首先来看一下基本的Qt对象。Qt包含了许多类去处理XML、多媒体、数据库和网络等等事物,但我们现在重点关注可视化的元素——窗口、对话框和
ascii0x03
2018/04/12
2.5K0
PySide6 GUI 编程(31):多个 QWidget 窗口展示
进程在刚启动时会初始化出两个窗口,这可以证明 init_new_window() 返回的对象是可以正常展示的
bowenerchen
2024/08/21
6133
PySide6 GUI 编程(31):多个 QWidget 窗口展示
PyQt十讲 | 浅谈信号与槽
信号与槽机制作为Qt最重要的特性,提供了任意两个Qt对象之间的通信机制。信号会在某个特定情况或动作下被触发,槽是用于接收并处理信号的函数。
潘永斌
2019/10/08
1.4K0
PyQt十讲 | 浅谈信号与槽
PySide6 GUI 编程(46): 基于QThread构造常驻后台的线程
在 PySide6 中,QRunnable 和 QThread 都可以用来在后台执行任务,但它们的使用场景和设计目的有所不同。
bowenerchen
2024/09/17
5040
PySide6 GUI 编程(46): 基于QThread构造常驻后台的线程
Python:PyQt学习
上面的代码把控件对应的变量名全部作为全局变量。如果要设计稍微复杂一些的程序,就会出现太多的控件对应的变量名。而且这样也不利于代码的模块化。所以,我们通常应该把 一个窗口和其包含的控件,对应的代码全部封装到类中,如下所示:
小简
2023/01/04
10.8K0
Python:PyQt学习
用PyQt5做图形界面(一)Hello world
PyQt是Python版本的Qt库,是最常用的跨平台图形界面编程框架之一。代码不用修改,就能同时运行在windows、linux、ios、andriod等平台。因此,对芯片设计行业来说,既可以用来开发大型EDA工具(通常用Qt的C++库),也可以用来开发公司内部的flow工具,还可以用作应用工程师的测试工具。所以,今天,以Linux平台为例,来介绍一下Python Qt的基本用法。
ExASIC
2023/02/17
1.6K0
用PyQt5做图形界面(一)Hello world
PySide——Python图形化界面入门教程(四)
PySide——Python图形化界面入门教程(四)               ——创建自己的信号槽               ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral.io/pysidepyqt-tutorial-creating-your-own-signals-and-slots/ 你不必局限于Qt widget提供的信号,你可以使用Signal类来创建自己的信号。下面是一个定义的简单例子: 1 from PyS
ascii0x03
2018/04/12
1.2K0
Qt Theme 纯 qss 的 Qt 主题
源码地址:https://github.com/hubenchang0515/QtTheme/
用户2270320
2025/03/11
2370
Qt Theme 纯 qss 的 Qt 主题
推荐阅读
相关推荐
PySide——Python图形化界面入门教程(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验