PyQt4入门教程(2)_PyQt4的第一个程序

article/2025/9/30 19:51:05

注:文中译者的话将用方括号【】标出。

这一部分我们将学习PyQt中一些基本的函数。

一个简单的例子

这是一个能够显示出一个窗口的简单例子。目前为止我们已经可以对这个窗口干很多事情了,比如说改变它的尺寸,最大化,最小化……干这些事情本来需要写很多代码,但是PyQt已经帮我们写好啦【开心】,由于干这些事情的代码在绝大多数应用中都会重复使用,所以没有必要一遍一遍地写这些代码。
我们可以感受到PyQt4是一个很高级的工具库,如果我们用一些比较低级的工具库的话,完成下面这些代码干的事情可能需要敲几百行代码!

# -*- coding: utf-8 -*-"""
In this example, we create a simple
window in PyQt4.
"""import sys
from PyQt4 import QtGuidef main():app = QtGui.QApplication(sys.argv)w = QtGui.QWidget()w.resize(250, 150)w.move(300, 300)w.setWindowTitle('Simple')w.show()sys.exit(app.exec_())if __name__ == '__main__':main()

上面这些代码可以在屏幕中显示出一个小窗口,大家试一试。接下来我们一句一句地讲解这些代码。

import sys
from PyQt4 import QtGui

这里我们导入了一些必要的组件,其中基本的GUI部件是包含在QtGui模块中的。

app = QtGui.QApplication(sys.argv)

每一个PyQt4应用都必须创建一个应用(application)对象,这个应用对象位于QtGui模块中。其中的sys.argv参数是由命令行参数组成的列表(list)。Python脚本也可以从shell中运行,这是我们控制脚本启动的一种方式。【这里暂时不理解也没有关系,影响不大,记住要创建application就行】

w = QtGui.QWidget()

QtGui.QWidget是PyQt4所有用户接口对象中的基础类库。我们在这里调用了QtGui.QWidget的默认构造函数,这个构造没有父对象。我们把没有父对象的部件(widget)叫做窗口(window)。【这里对于父对象暂时也不需要理解,理解不到也没关系。这句中我们就是创造了一个没有父对象的部件,也就是创建了一个窗口w。】

w.resize(250, 150)

很好理解,resize()方法可以调整部件的大小,我们把它调整成了250px宽,150px高。

w.move(300, 300)

move()方法将我们的部件移动到了屏幕上坐标为x=300,y=300的地方。【注:屏幕的坐标是以左上角为原点的,横着是x轴,竖着是y轴。】

w.setWindowTitle('Simple')

这里我们设定了部件(其实是个窗口)的标题,标题将在标题栏中显示。

w.show()

show()方法使我们创建的部件能够在屏幕上显示出来。部件先在内存(memory)中被创建,之后再被显示到屏幕上。

sys.exit(app.exec_())

在显示了窗口之后,我们进入了程序的主循环,并且开始处理时间。主循环从窗口接收事件并对部件进行处理。如果我们调用exit()函数或者关闭最主要的部件,主循环将终止。这里的sys.exit()调用保证程序完全退出。
值得一提的是exec_()中有一个下划线,为什么呢?因为exec是一个Python关键字,因此加了下划线。
最后,我们运行程序,就会得到下面这个简单的窗口。
Simple

应用的图标

应用图标是那个在应用窗口左上角显示的那个东西。下面这个例子展示了如何在PyQt4中定制应用图标。我们还会介绍一些新的函数。

# -*- coding: utf-8 -*-"""
This example shows an icon
in the titlebar of the window.
"""import sys
from PyQt4 import QtGuiclass Example(QtGui.QWidget):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Icon')self.setWindowIcon(QtGui.QIcon('web.png'))        self.show()def main():app = QtGui.QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()    

是不是感觉画风突变?那是因为我们在第一个例子中使用的是过程式编程风格。Python语言同时支持过程式编程和面向对象编程风格,上面这个例子就是用面向对象的编程风格编写的。而你需要知道,用PyQt4编程就以为着面向对象编程(OOP)【为什么要用面向对象的编程风格?务必百度一下。】

class Example(QtGui.QWidget):def __init__(self):super(Example, self).__init__()...

在面向对象的编程中最重要的三个东西是类(classes),数据(data)和方法(methods)。这里我们创建了一个新的类叫做Example,括号中的QtGui.QWidget表明这个Example类是从QtGui.QWidget类继承来的。这意味着我们为新类写构造函数时需要调用被继承类的构造函数。super(Example, self)返回了Example的父对象(即QtGui.QWidget),接着我们调用了父对象的构造函数。注意__init__是Python中的构造函数。

self.initUI()

这里我们调用了一个我们自己写的initUI()函数来创建GUI。

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('web.png'))

由于我们是继承 QtGui.QWidget类,我们的新类其实就是一个部件(widget),有widget的所有方法,这三个方法就都出自widget。
我们先来介绍一下setGeometry这个方法,它做了两件事情:将部件定位并设定了它的大小【其实就是resize和move的混合函数】。前两个参数是部件相对于父元素的x,y坐标【这里其实是个窗口(window),没有父元素记得吗?所以是屏幕上的x,y坐标。】,后两个参数是部件的宽和高。
接下来说一下setWindowIcon这个方法,它设定了应用的图标。为了做到这一点,我们创建了一个QtGui.QIon对象,创建时的参数就是我们想要的图标的路径。

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

启动代码放在了main函数中,我们先创建一个应用(application),然后创建我们定义的新类Example的一个实例ex。
【注意if __name__ == '__main__'这个Python中惯用的定义入口点的方式。】
最后的效果就是这个样子,图标变啦:
Icon

显示提示栏

我们可以让鼠标移到部件上时显示提示信息。

# -*- coding: utf-8 -*-"""
This example shows a tooltip on 
a window and a button
"""import sys
from PyQt4 import QtGuiclass Example(QtGui.QWidget):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))self.setToolTip('This is a <b>QWidget</b> widget')btn = QtGui.QPushButton('Button', self)btn.setToolTip('This is a <b>QPushButton</b> widget')btn.resize(btn.sizeHint())btn.move(50, 50)       self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Tooltips')    self.show()def main():app = QtGui.QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在这个例子中,我们使两个部件可以显示提示信息。

QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))

这个方法设置了一个用来显示提示信息的字体,我们使用大小10px的SansSerif字体。

self.setToolTip('This is a <b>QWidget</b> widget')

为了创建一个提示框,我们调用setTooltip()这个方法,我们还可以使用html标签【厉害吧】。

btn = QtGui.QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

这里我们创建了一个按钮,并给它加上了提示框(Tooltip)。

btn.resize(btn.sizeHint())
btn.move(50, 50)

我们设定了按钮的大小,位置。其中sizeHint()方法返回了一个推荐的大小。
最后运行出来是这个样子的:
ToolTip

关闭窗口

最显然的一种关闭窗口的办法当然是点击窗口右上角的那个叉叉。在下一个例子中,我们将会展示怎样程序性地关闭窗口,比如设置一个有关闭窗口作用的按钮。我们还会简单地接触到信号(与)槽系统(signals and slots)。
我们在例子中要使用的QtGui.QPushButton的构造函数原型是这样的:

QPushButton(string text, QWidget parent = None)

其中text参数是按钮上显示的文字。parent参数是部件的父对象,在这里就是我们要把按钮放在什么上,本例中是一个QtGui.QWidget【其实是一个窗口(window)】。

# -*- coding: utf-8 -*-"""
This program creates a quit
button. When we press the button,
the application terminates. 
"""import sys
from PyQt4 import QtGui, QtCoreclass Example(QtGui.QWidget):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):               qbtn = QtGui.QPushButton('Quit', self)qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)qbtn.resize(qbtn.sizeHint())qbtn.move(50, 50)       self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Quit button')    self.show()def main():app = QtGui.QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

在本例中,我们创造了一个有退出作用的quit按钮,只要鼠标点击这个按钮,应用就终止运行了。

from PyQt4 import QtGui, QtCore

这里我们需要QtCore中的一个对象,所以需要额外引入这个模块。

qbtn = QtGui.QPushButton('Quit', self)

这里我们创造了一个按钮(push button),它是QtGui.QPushButton类的一个实例。第一个参数是按钮上的文字,第二个参数是父对象,这里就是我们创建的Example了,也就是self,它继承自QtGui.QWidget类【Example没有父对象,是一个窗口(window),记得吗】。

qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)

PyQt4中的事件处理系统是由信号槽机制(signals and slots)实现的。如果我们点击了这个按钮,就会发出“clicked”这个信号。QtCore.QCoreApplication这个东西包含了程序的主循环,它处理和分派所有的事件,而instance()方法返回的是目前的实例(insatnce)。注意到QtCore.QCoreApplication随着QtGui.QApplication的创建而创建,而由于我们这里用connect()函数将“clicked”事件和可以终止应用的quit()函数联系(connect)在了一起,所以点击按钮,应用终止。这种交流在两个对象之间完成:发送者和接受者,其中发送者是按钮,接受者是应用本身。【这里只要大家对connect方法有个感性的认识就可以了】
运行出来就是这个样子:
quitbutton

消息框(Message Box)

默认情况下,如果我们点击了程序右上角的叉叉,
QtGui.QWidget部件就会被关闭。但有时我们想要改变这种默认的行为,比如说,如果我们在编辑一些东西,关闭窗口时我们想要弹出一个消息框来确认是否退出。

# -*- coding: utf-8 -*-"""
This program shows a confirmation 
message box when we click on the close
button of the application window. 
"""import sys
from PyQt4 import QtGuiclass Example(QtGui.QWidget):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):               self.setGeometry(300, 300, 250, 150)        self.setWindowTitle('Message box')    self.show()def closeEvent(self, event):reply = QtGui.QMessageBox.question(self, 'Message',"Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)if reply == QtGui.QMessageBox.Yes:event.accept()else:event.ignore()        def main():app = QtGui.QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()

根据类定义,如果关闭QtGui.QWidget,QtGui.QCloseEvent将会执行。所以为了达到我们的目的,我们需要重新定制closeEvent()这个事件句柄(event handler)如下。

reply = QtGui.QMessageBox.question(self, 'Message',"Are you sure to quit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)

这里我们设定显示一个有两个选项(yes & no)的消息框(message box)。QtGui.QMessageBox.question()方法的第二个参数是出现在标题栏的标题,第三个参数是消息框显示的对话内容,第四个参数是出现在消息框的按钮的组合【用或( | )连接】,最后一个参数是默认按钮,即消息框刚跳出来的时候按enter键就可以执行的按钮。这里我们将函数的返回值存储在了reply这个变量中。

if reply == QtGui.QMessageBox.Yes:event.accept()
else:event.ignore()

这里我们测试函数的返回值。如果我们点击了Yes按钮,close这个事件将会被接受(accept),部件关闭、应用结束;否则close这个事件将会被忽视(ignore),程序继续执行。
运行出来是这个样子:
messagebox

使窗口显示在屏幕中间

下面这个脚本实现了让窗口在屏幕的中央显示。

# -*- coding: utf-8 -*-"""
This program centers a window 
on the screen. 
"""import sys
from PyQt4 import QtGuiclass Example(QtGui.QWidget):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):               self.resize(250, 150)self.center()self.setWindowTitle('Center')    self.show()def center(self):qr = self.frameGeometry()cp = QtGui.QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)self.move(qr.topLeft())def main():app = QtGui.QApplication(sys.argv)ex = Example()sys.exit(app.exec_())if __name__ == '__main__':main()     

其中QtGui.QDesktopWidget这个类提供了用户桌面的信息,包括屏幕大小。

self.center()

我们调用一个自己写的center()方法来实现窗口在屏幕中央显示。

qr = self.frameGeometry()

这里我们用frameGeometry方法得到了主窗口的矩形框架qr。

cp = QtGui.QDesktopWidget().availableGeometry().center()

我们调用这些方法来得到屏幕分辨率,并最终得到屏幕中间点的坐标cp。

qr.moveCenter(cp)

这里我们将矩形框架移至屏幕正中央,大小不变。

self.move(qr.topLeft())

最后我们将应用窗口移至矩形框架的左上角点,这样应用窗口就位于屏幕的中央了【注意部件的move都是左上角移动到某点】。

好了,这就是本节全部的内容了,我们已经掌握了一些基本的方法!


http://chatgpt.dhexx.cn/article/sHNDXJqx.shtml

相关文章

一、PyQt基础知识

一、基础知识 &#xff08;一&#xff09;简介 1. 什么是PyQt5 PyQt是基于Digia公司强大的图形程序框架Qt的Python接口&#xff0c;由一组Python模块构成&#xff0c;它是一个创建GUI应用程序的工具包&#xff0c;由Phil Thompson开发。 自从1998年首次将Qt移植到Python上形…

PyQt完整入门教程

https://blog.csdn.net/baidu_37503452?spm1000.2115.3001.5343 1、GUI开发框架简介 19年来&#xff0c;一直在做Android ROM相关测试&#xff0c;也有了一定的积累&#xff1b;20年&#xff0c;计划把之前完整的测试方案、脚本、工具进行整合复用。 第一期计划是开发一个GUI的…

PyQt上手教程汇总

根据此前的PyQt学习&#xff0c;这里对PyQt的学习过程进行最后的总结 前文链接&#xff1a;由于前文标题名字取了一样的,以下内容按照前后顺序排列 (1)PyQt上手教程&#xff08;一&#xff09;_机械刘怀洋的博客-CSDN博客 (2)PyQt上手教程&#xff08;一&#xff09;_机械刘…

pyqt基础教程

PYQT是python版本的QT界面程序包&#xff0c;大家写过C、C#都做过界面设计&#xff0c;python也一样&#xff0c;非常简单。跟着我的思路走&#xff0c;五分钟学会&#xff01; 1、主体框架先造一个窗口 以下程序直接抄过去。 以下程序直接抄过去。 以下程序直接抄过去。 #!…

Mac 下安装pip,卸载pip方法

mac下直接安装pip和卸载pip的方法如下&#xff1a; 1、pip的安装&#xff1a; 输入 sudo easy_install pip 就可以安装 pip 了。 验证pip安装是否成功&#xff1a; 输入&#xff1a;pip 结果找不到文件。 尝试输入&#xff1a;pip3 -V 或者 pip3 则说明已经安装成功了。 …

pip3在Ubuntu下的安装、升级、卸载

一、参考资料 pip 常用命令 pip 官方文档 二、安装pip包 如何在 Ubuntu 20.04 上安装 Python Pip - 知乎 (zhihu.com) 1. 离线安装 Installation pip下载地址 1.1 为 Python 3 安装 pip 方式一 # 下载get-pip.py脚本 wget https://bootstrap.pypa.io/pip/3.6/get-pip.p…

conda和pip卸载包的注意事项

安装和import时包的名称不一致时&#xff0c;比如scikit-learn和sklearn&#xff08;scikit意思是科学工具箱&#xff0c;通常被缩写成sk, 比如scikit-image和skimage也是同样的情况&#xff09; 卸载的时候还是应该用包的全称&#xff0c;也就是与安装时一致用pip安装的就要用…

Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法

因为安装的 PyHook3 没安装对吧&#xff0c;有点问题&#xff0c;就想着把它卸载掉&#xff0c;然后再重新安装一个&#xff0c;那应该怎么卸载呢&#xff1f; 非常简单&#xff0c;就是 pip uninstall xxx&#xff0c;正好和我们安装时的 pip install xxx 对应&#xff0c;下…

windows下将python自带的pip卸载了,怎么重新装pip

文章目录 windows下将python自带的pip卸载了&#xff0c;怎么重新装pipLinux下将python自带的pip卸载了&#xff0c;怎么重新装pip新装Linux系统没有pip怎么装pip方法1方法2方法3总结 Linux换pip为国内镜像源|pip换源|pip修改源 windows下将python自带的pip卸载了&#xff0c;怎…

解决“更新pip版本竟将pip卸载了,提示No module named ‘pip‘”

更新pip后&#xff0c;报错无权限之类的&#xff0c;结果在运行pip发现被卸载了。 ModuleNotFoundError: No module named ‘pip’ ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe4c7037709d4c7495627a706eb0ff28.png?x-oss-processimage/watermark,type_d3F5LXplbmhl…

如何使用Pip卸载软件包?

Python Pip command provides search, install, update, uninstall packages. We can use pip command to uninstall packages easily even there are some alternatives like easy_install. Python Pip命令提供搜索,安装,更新,卸载软件包。 即使有easy_install之类的替代方…

【三维点云】01-激光雷达原理与应用

文章目录 内容概要1 激光雷达原理1.1 什么是激光雷达&#xff1f;1.2 激光雷达原理1.3 激光雷达分类三角法TOF法脉冲间隔测量法幅度调制的相位测量法 相干法激光雷达用途 2 激光雷达安装、标定与同步2.1 激光雷达安装方式考虑因素 2.2 激光雷达点云用途2.3 数据融合多激光雷达数…

轻量化固态激光雷达的三维定位与建图

点云PCL免费知识星球&#xff0c;点云论文速读。 文章&#xff1a;Lightweight 3-D Localization and Mapping for Solid-State LiDAR 作者&#xff1a;Han Wang, Chen Wang, and Lihua Xie 编译&#xff1a;点云PCL 代码&#xff1a;https://github.com/wh200720041/ssl_slam.…

ROS移动机器人 Solidworks整个机器人设计文件(三维 激光雷达 arduino nvidia)(SLDPRT SLDASM)

还是17年本科时制作的毕业设计&#xff0c;基于solidworks 2014所制作。 文件里包含了制作的整个移动机器人的SolidWorks原文件。 是设计完各个零件然后组合在一起的&#xff0c;所以适用性很强&#xff0c;可以根据你的需求将绘制的零件加到你的机器人solidwroks三维中&…

Velodyne 16线三维激光雷达

Velodyne 16线三维激光雷达VLP-16介绍 16线激光雷达VLP-16是Velodyne公司出品的小型的3维激光雷达&#xff0c;保留了电机转速可调节的功能。实时上传周围距离和反射率的测量值。16线激光雷达VLP-16具有100米的远量程测量距离。精巧的外观设计使得安装非常方便。重量轻&#xf…

技术分享 | 带你探索三维激光雷达“眼中”的世界

远在火星的美国毅力号探测器早已开始工作&#xff0c;并不断的采集火星的数据传回到地球。现实中距离大众最近的无人车有谷歌的Google Driverless Car&#xff0c;以及特斯拉的model电动汽车。无人驾驶汽车正逐渐走进普通人的生活中。 毅力号火星探测器 谷歌无人汽车 提到无人驾…

ubuntu18.04使用calibration_toolkit进行相机和三维激光雷达的联合标定

一、配置 硬件配置&#xff1a; 速腾聚创激光雷达32线、usb相机&#xff1b; 软件配置&#xff1a; ubuntu18.04、calibration_toolkit、autoware1.12.0、opencv3.4.3 (软件的安装及配置遇到的问题可以参考我别的博客&#xff0c;可能会有你想要的答案&#xff0c;标定其实…

ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定

实现环境&#xff1a; 系统环境&#xff1a; Ubuntu16.04激光雷达&#xff1a; velodyne16线imu品牌 &#xff1a; xsens 一 简介 lidar-imu标定方法为瑞士苏黎世理工大学-自动驾驶实验室开源的一种校准 3D 激光雷达和 6 自由度位姿传感器外参的方法。该方法需要大量非平面…

【ouster】ubuntun18.04安装ouster三维激光雷达ros版本驱动

1、下载驱动文件 需先创建一个ros工作区间&#xff0c;如何将代码下载至src文件夹 mkdir catkin_ws_ouster/srccd catkin_ws_ouster/srccatkin_init_workspacecd ..source devel/setup.shsudo gedit ~/.bashrc#将下列代码添加至打开的文件source ~/catkin_ws_ouster/devel/set…