PyQt5简易入门指南02,简单图片显示程序
来源:互联网 发布:罗技逆战宏编程 编辑:程序博客网 时间:2024/04/29 09:53
一个简单的例子
以下是一个用pyqt5写成的简单图片显示程序。
该图片显示程序由一个QLabel和QPushButton组成,当单击按钮时,会弹出一个文件选择对话框,让用户选择合适的图片文件。在用户按下确定后程序会将用户所选择的图片进行显示。
启动脚本
main.py依然作为这个程序的启动脚本。
import sysfrom PyQt5.QtWidgets import QApplicationfrom dumbDialog import DumbDialog
以上代码导入必要的pyqt5类,完成脚本的启动。其中,我们对上一节例子中的DumbDialog进行了一些小小的修改。不再将它写在main.py里,而是单独写在一个名为dumbdialog.py的脚本文件里,之后再通过上述代码对该类进行导入。接下来的代码:
if __name__ == "__main__": app = QApplication(sys.argv) #创建QApplication类的实例 dia = DumbDialog() #创建DumbDialog类的实例 dia.show() #显示程序主窗口 app.exec_() #开启事件主循环
如果是曾经学过Qt的同学,会不会觉得以上的代码看着非常的熟悉。没错,pyqt和c++的Qt除了细节上有一点不同之外,其它的套路都是差不多的。大部分类的属性和方法都没有作任何的改变。除了几个关键的地方之外,其它部分完全是可以参考Qt的c++文档完成的。
程序的主窗口
dumbDialog.py中的DumbDialog类作为程序的主窗口,由一个QLabel负责显示信息和图片以及一个QPushButton负责弹出文件对话框,并在用户选择合适图片后通过QLabel进行显示。
首先是类的定义:
class DumbDialog(QDialog):
括号中的QDialog类表示这个类是继承于QDialog的,这个是python面向对象的一个基础知识,不懂的同学可以去查阅相关的资料,个人认为这个还是比较简单的,这里就不再赘述。
然后是这个类的构造函数:
def __init__(self, parent = None): super(DumbDialog, self).__init__(parent) self._title = "image_loader" #设置类实例成员_title,它的值为字符串的"image_laoder" self._diawidth = 300 #设置实例成员_diawidth,它的值为300 self._diaheight = 450 self.setWindowTitle(self._title) #设置窗口标题 self.setMinimumHeight(self._diaheight) #设置窗口最小的大小 self.setMinimumWidth(self._diawidth) self.imageView = QLabel("add a image file") #得到一个QLabel的实例,并将它保存在成员imageView里,负责显示消息以及图片 self.imageView.setAlignment(Qt.AlignCenter) #设置QLabel居中显示 self.btn_open = QPushButton("open") #实例化一个名为"open"的按钮,并将它保存在类成员btn_open中,负责去得到图片的路径,并在QLabel中显示 self.btn_open.clicked.connect(self.on_btn_open_clicked) #pyqt5中信号与槽的连接 self.vlayout = QVBoxLayout() self.vlayout.addWidget(self.imageView) self.vlayout.addWidget(self.btn_open) self.setLayout(self.vlayout)
我们可以看到构造函数中,与信号和槽连接相关的代码为:
self.widget_name.signal_name.connect(self.slot_name)
而以上的代码在pyqt4中是通过以下的方式进行表示的:
self.connect(self.widget_name, SIGNAL("signal_name(args)"), self.slot_name)
如果同学们以前学过c++版本的Qt,可以很容易的发现,在pyqt4中的信号与槽的连接与在c++中信号与槽的连接最为相似,但是比起pyqt5中的新方法这种方法就略显麻烦,冗杂了。
槽函数
在pyqt5中,槽函数数一般是通过python装饰器@pyqtSlot(typename)进行修饰的。譬如,例子中槽函数表示为:
@pyqtSlot(bool)def on_btn_open_clicked(self, checked): self.filename = QFileDialog.getOpenFileName(self, "OpenFile", ".", "Image Files(*.jpg *.jpeg *.png)")[0] if len(self.filename): self.image = QImage(self.filename) self.imageView.setPixmap(QPixmap.fromImage(self.image)) self.resize(self.image.width(), self.image.height())
通过查阅Qt文档我们可以知道,clicked这个信号是带一个bool的参数的,因此我们需要在装饰器pyqtSlot里进行声明,即bool。之后,上述槽函数的第二个参数”checked”,即为这个bool参数的具体值。对于python装饰器还不是很理解的同学可以去查阅相关资料,这个个人认为还是比较麻烦不好懂的。同学们可以多花费一点时间在这个上面。
这个槽函数要做的工作非常简单,在用户按下按钮后先弹出一个文件对话框,用户选择图片文件后就把文件名存储在self.filename里。之后通过这个具体的文件路径创建一个QImage的实例目的是为了为使用QPixmap.fromImage方法做准备。之后通过这个静态方法产生一个QPixmap的实例,之后就可以通过QLabel的setPixmap设置图片了。整个过程还是非常简单易懂的。如果对上述的过程还有疑问,可以查阅Qt的相关文档。
总结
至此,这个简单的例子就分析完毕了。同学们可以在https://git.oschina.net/linuxlike/PyQtJianYiRuMenZhiNan上下载项目的源代码进行分析学习。
(本篇文章是我个人分析总结的结果,难免存在不足和错误的地方,如果大家看到,还请就相关的问题提出意见,进行交流。)
- PyQt5简易入门指南02,简单图片显示程序
- PyQt5简易入门指南01,环境的配置与搭建
- PyQt5简易入门指南03,使用资源文件和设计师
- PyQt5:使用PyQt5 创建入门程序 (1)
- pyqt5 使用cv2 显示图片,摄像头
- LaTeX-TexmakerX 简易入门指南
- PyQt5教程-02-程序图标
- Freemarker简单入门指南
- 微信小程序入门指南
- 一个基于python3+PyQt5实现的简单计算器程序
- 简单入门小程序02
- Linux 下C++开发入门指南,简易入门版
- ViewPager显示广告图片超简易使用方法
- PyQt5实时显示Camera
- python pyqt5 入门
- Python简易图片批量压缩程序
- BMP图片显示程序
- DFB图片显示程序
- JS的事件委托/代理(delegate)
- codeforces 776C
- CF471D MUH and Cube Walls(差分+KMP)
- button、a标签、input button的区别
- Swift3.0中的Json对象和Json字符串
- PyQt5简易入门指南02,简单图片显示程序
- Step 2:Processing入门
- LeetCode(15)--4Sum
- 1126: 布尔矩阵的奇偶性
- 2017CSU暑假集训 Languages
- 架构师日记——Nginx简介
- linux 学习(1)
- POJ
- 结构体内不定长数组初始化,error: #1077: an initializer cannot be specified for a flexible array member