目录

一、环境配置

1.1 安装PyQt5

1.2 安装Qt工具包

1.3 配置环境变量

?1.4 测试PyQt5

?1.5?配置PyCharm

二、QtDesigner 窗口简单介绍

2.1 初始界面

2.2 控件介绍

?三、相关函数

3.1 读取文件函数

3.1.1?打开本地图片

3.1.2?保存图片到本地

3.1.3?打开文件夹

3.1.4?打开本地文本文件并显示

3.1.5?保存文本到本地

3.1.6?Qimage转换为mat类型

3.2 关联函数

四、代码实现

4.1 登录界面

4.2 操作界面

4.3 主函数

五、测试分析

5.1 结果展示

5.2 结果分析

总结


一、环境配置

1.1 安装PyQt5

按住win+R输入cmd在命令行下使用pip安装,但是需要**SIP的支持,所以先安装SIP**,再安装pyqt5

pip install sip

由于安装默认使用国外的镜像,可能因为网络问题会导致下载慢或者失败的现象。所以我们可以使用国内的镜像,比如清华的镜像源:https://pypi.tuna.tsinghua.edu.cn/simple

或者豆瓣源:http://pypi.douban.com/simple/

pip install sip -i https://pypi.tuna.tsinghua.edu.cn/simplepip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple

如果遇到以下错误:

解决方法:直接选用pip源并且信任它的来源就可以解决这种问题

如豆瓣源:

pip install 库包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

这里的 pip源 换成清华源、阿里源等都适用。

1.2 安装Qt工具包

安装图形界面开发工具Qt Designer,同样打开命令行,输入以下命令:

pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 配置环境变量

安装好PyQt5和PyQt5-tools成功后,还需要配置相关的环境变量。

1.可以在python的安装目录Libsite-packahes目录下看到安装包。比如我的是安装了Anaconda,在它自带的python解释器下安装的,路径为:

将pyqt5_tools路径添加到系统环境变量path中:

配置完成后,我们打开命令行,输入path命令,可以看到设置的环境变量值:

1.4 测试PyQt5

(1) 配置完毕后,我们打开命令行,输入python命令,进入到Python的环境中:

(2) 然后输入import PyQt5,如果运行成功,说明安装成功:

1.5配置PyCharm

配置PyCharm是为了在Pycharm里面实现打开qt designer,进行界面设置,生成ui文件,以及方便转换成python文件。

(1)搭建Qt Designer,打开Pycharm后,进入settings 按下图操作:

下面是Qt Designer窗口中的填写内容的一些补充:

Name:可自己定义
program:Qt Designer的安装路径(如果是Anaconda下面安装的PyQt5-tools,则在D:pythonAnacondaLibraryin文件下)
parameter:不填
directory: ‘FileDir‘`FileDir`‘FileDir‘

(2)搭建PyUIC,这个主要是用来将 Qt界面 转换成 py代码,继续点击新建添加,按下图操作:

下面是在新增PyUIC窗口中的填写内容:

Name:可自己定义
program:pyuic的安装路径(如果是Anaconda,则在D:pythonAnacondaScripts文件下)
parameter:‘FileName`FileName‘FileName -o FileNameWithoutExtension‘FileNameWithoutExtension`FileNameWithoutExtension‘.py

directory: ‘FileDir‘`FileDir`‘FileDir‘

完成后可在pycharm打开Qt Designer,这就是我们的目的:

至此环境配置完毕。

二、QtDesigner 窗口简单介绍

2.1 初始界面

初次打开软件,应该直接可以创建,关掉了,就在 File -> New 中打开,创建窗口简单介绍:

2.2 控件介绍

按界面顺序做简要说明:

Vertical Layout等布局详解:Layouts布局

三、相关函数

做一个素描图像生成器,来练习使用PyQt5,基本流程是从文件夹读取,然后转为灰度图,再反转模糊图像,达到素描的效果,最后保存结果。

3.1 读取文件函数

PyQt中QFileDialog常用来打开保存文件或打开文件对话框,允许用户选择本地文件或者文件夹,

常用方法有:

QFileDialog.getOpenFileName()    #获取一个打开文件的文件名
QFileDialog.getOpenFileNames()   #获取多个打开文件的文件名
QFileDialog.getExistingDirectory()  #获取打开文件夹的文件名
QFileDialog.getOpenFileUrl()     #获取一个打开文件的统一资源定位符
QFileDialog.getOpenFileUrls()    #获取多个打开文件的统一资源定位符
QFileDialog.getSaveFileName()    #获取保存的文件名
QFileDialog.getSaveFileUrl()     #获取保存的url

3.1.1打开本地图片

**QFileDialog.getOpenFileName()**返回值有两个,第一个是选择文件的文件名(文件路径),我们可以通过这个文件名打开本地文件,第二个是选择文件的类型。

输入有4个参数,第一个参数一般是self,第2个参数是弹出框的标题,第3个参数是打开对话框的默认地址,第4个参数是过滤字符串,一般用来限制文件类型,定义打开文件下拉框中的可选列表,并且不同的文件类型用两个分号;;隔开。

# 选择本地图片上传
def openImage(self):global imgNamepath  # 这里为了方便别的地方引用图片路径,将其设置为全局变量# 弹出一个文件选择框,第一个返回值imgName记录选中的文件路径+文件名,第二个返回值imgType记录文件的类型# QFileDialog就是系统对话框的那个类第一个参数是上下文,第二个参数是弹框的名字,第三个参数是默认打开的路径,第四个参数是需要的格式imgNamepath, imgType = QFileDialog.getOpenFileName(self.centralwidget, "选择图片","D:\","*.jpg;;*.png;;All Files(*)")# 通过文件路径获取图片文件,并设置图片长宽为label控件的长、宽img = QtGui.QPixmap(imgNamepath).scaled(self.label_3.width(), self.label_3.height())# 在label控件上显示选择的图片self.label_3.setPixmap(img)# 显示所选图片的路径self.lineEdit_3.setText(imgNamepath)

3.1.2保存图片到本地

(1)保存图片到本地的第一种方式:首先把图片所在label控件截图,然后打开一个保存文件的弹出框,最后保存截图到选中的路径。

def saveImage(self):screen = QApplication.primaryScreen()pix = screen.grabWindow(self.label_4.winId())fpath, ftype = QFileDialog.getSaveFileName(self.centralwidget, "保存图片", "d:\", "*.jpg;;*.png;;All Files(*)")pix.save(fpath)

(2)保存图片到本地的第二种方式:首先提取相对应Qlabel中的图片,然后打开一个保存文件的弹出框,最后保存图片到选中的路径。

def saveImage(self):# 提取Qlabel中的图片img = self.label_4.pixmap().toImage()fpath, ftype = QFileDialog.getSaveFileName(self.centralwidget, "保存图片", "d:\", "*.jpg;;*.png;;All Files(*)")img.save(fpath)

以下函数读取文件函数在此实验没用到,只是用来记录

3.1.3打开文件夹

# 打开文件夹(目录)
def openDirectory(self):fd = QFileDialog.getExistingDirectory(self.centralwidget, "选择文件夹", "")# 这里的label_directoryPath要根据项目替换成自己的组件self.label_directoryPath.setText(fd)

3.1.4打开本地文本文件并显示

# 选择文本文件上传def openTextFile(self):  # 选择文本文件上传fd, fp = QFileDialog.getOpenFileName(self.centralwidget, "选择文件", "d:\", "*.txt;;All Files(*)")f = open(fd, 'r')self.label_txt.setText(f.read())self.label_filePath.setText(fd)f.close()

3.1.5保存文本到本地

# 保存文本文件def saveTextFile(self):fd, fp = QFileDialog.getSaveFileName(self.centralwidget, "保存文件", "d:\", "*.txt;;All Files(*)")f = open(fd, 'w')f.write(self.label_txt.text())f.close()

3.1.6Qimage转换为mat类型

# 将Qimage转换为mat类型def qimage_to_mat(self,qimg):ptr = qimg.consBits()ptr.setsize(qimg.byteCount())mat = np.array(ptr).reshape(qimg.height(),qimg.width(),4)   # 注意通道数要填4,否则报错return mat

3.2 关联函数

# 按钮关联函数
self.pushButton_2.clicked.connect(self.openImage)
self.pushButton_3.clicked.connect(self.startAction)
self.pushButton_4.clicked.connect(self.saveImage)

注意函数名后面没有括号,和方法调用有点不一样self.openImage和self.openImage().

素描图像生成函数:

# 生成素描图
def startAction(self):img = cv2.imread(imgNamepath)img = cv2.resize(img, dsize=(768, 1080))# 图像转灰度图像gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 灰度图像到反转灰度图像inverted_gray_image = 255 - gray_image# 模糊倒置灰度图像blurred_inverted_gray_image = cv2.GaussianBlur(inverted_gray_image, (19, 19), 0)# 反转模糊图像inverted_blurred_image = 255 - blurred_inverted_gray_image# 准备照片素描sketck = cv2.divide(gray_image, inverted_blurred_image, scale=256.0)path = "D:\python\RRJ\pycharmProject2\zhanCunDiZhi\"# 因为不知道怎么将<class 'numpy.ndarray'>转换为<class 'PyQt5.QtGui.QPixmap'>类型,因此采用暂存再读出的方式cv2.imwrite(path + 'ZC.jpg', sketck)# pyqt5从路径读取图片imgShow = QPixmap(path + 'ZC.jpg')self.label_4.setScaledContents(True)self.label_4.setPixmap(imgShow)

在将结果图显示在label控件时报错,因为类型不一致不知道怎么将**<class ‘numpy.ndarray’>转换为<class ‘PyQt5.QtGui.QPixmap’>**类型,因此采用暂存再读出的方式代替。

四、代码实现

在测试时还加入了一个跳转页面的测试,通过百度查询的到前后端分离的方法实现QMainWindow之间的跳转

首先利用QtDesigser和PyUIC得到前端界面的代码,并且创建对应得后端代码。

4.1 登录界面

(第一个界面)前端界面代码:test1.py

import sysfrom PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPalette, QPixmap, QBrush
from PyQt5.QtWidgets import QApplication, QMainWindowclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(943, 641)# 给MainWindow设置背景图片# palette = QPalette()# palette.setBrush(QPalette.Background, QBrush(QPixmap('D:\python\RRJ\pycharmproject\Practice\chep2\bdd'#                                                      '\background3.jpg')))# MainWindow.setPalette(palette)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(140, 220, 101, 31))self.label_2.setStyleSheet("font:32px;")self.label_2.setObjectName("label_2")self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setGeometry(QtCore.QRect(140, 320, 101, 31))self.label_3.setStyleSheet("font:32px;")self.label_3.setObjectName("label_3")self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit.setGeometry(QtCore.QRect(250, 220, 181, 31))self.lineEdit.setObjectName("lineEdit")self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_2.setGeometry(QtCore.QRect(250, 320, 181, 31))self.lineEdit_2.setObjectName("lineEdit_2")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(180, 410, 181, 51))self.pushButton.setStyleSheet("color:rgb(101,153,26);
""background-color:rgb(198,224,205);
""hover{color:red};
""border-radius:6px;
""font:28px;")self.pushButton.setObjectName("pushButton")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(170, 50, 651, 101))self.label.setStyleSheet("border-width:0px;
""border-style:solid;
""border-color:rgb(50, 50, 50);
""font:54px;
""
""color:rgb(255, 170, 0)")self.label.setObjectName("label")self.label_6 = QtWidgets.QLabel(self.centralwidget)self.label_6.setGeometry(QtCore.QRect(490, 170, 361, 361))# self.label_6.setStyleSheet("border-width:1px;
"#                            "border-style:solid;")self.label_6.setText("")self.label_6.setObjectName("label_6")# 给label添加背景图片png = QPixmap('D:\download\hg.jpg')self.label_6.setPixmap(png)# 图片自适应窗体大小self.label_6.setScaledContents(True)MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 943, 26))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.label_2.setText(_translate("MainWindow", "用户名"))self.label_3.setText(_translate("MainWindow", "密  码"))self.pushButton.setText(_translate("MainWindow", "登 录"))self.label.setText(_translate("MainWindow", "欢迎使用素描图像生成器"))

对应得界面:

(第一个界面)登录界面对应的后端代码:enterTest1.py

import sysimport enterTest2
import test1
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog, QMessageBox
from PyQt5 import QtWidgets# 这里定义的第一个界面的后端代码需要继承两个类
class FirstWindowActions(test1.Ui_MainWindow, QMainWindow):def __init__(self):super(test1.Ui_MainWindow, self).__init__()# 创建界面self.setupUi(self)self.pushButton.clicked.connect(self.click_login_button)def click_login_button(self):"""点击登录按钮,跳转到相应界面"""# 实例化第二个界面的后端类,并对第二个界面进行显示self.scend_window = enterTest2.SecondWindowActions()# 显示第二个界面self.scend_window.show()# 关闭第一个界面self.close()# if __name__ == '__main__':
#     # 界面的入口,在这里需要定义QApplication对象,之后界面跳转时不用重新定义,只需要调用show()函数jikt
#     app = QApplication(sys.argv)
#     # 显示创建的界面
#     MainWindow = FirstWindowActions()  # 创建窗体对象
#     MainWindow.show()  # 显示窗体
#
#     sys.exit(app.exec_())  # 程序关闭时退出进程

4.2 操作界面

(第二个界面)前端界面代码:test2.py

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'test2.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.import cv2
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap, QBrush
from PyQt5.QtWidgets import QFileDialog, QApplication
from PyQt5.QtGui import QIconfrom PyQt5.QtGui import QPaletteclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")# 给MainWindow设置图标MainWindow.setWindowIcon(QIcon('D:\download\xj.ico'))  # 路径错误找不到问题所在# 给MainWindow设置背景图片# palette = QPalette()# palette.setBrush(QPalette.Background, QBrush(QPixmap('D:\python\RRJ\pycharmproject\Practice\chep2\bdd'#                                                      '\background3.jpg')))# MainWindow.setPalette(palette)MainWindow.resize(994, 783)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(10, 0, 961, 721))self.label.setStyleSheet("font:28px;
""border-style:solid;
""border-width:1px;
""border-color:rgb(0, 0, 0);
""
""")self.label.setText("")self.label.setObjectName("label")self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(50, 150, 121, 41))self.pushButton_2.setStyleSheet("font:22px;")self.pushButton_2.setObjectName("pushButton_2")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(340, 30, 321, 81))self.label_2.setStyleSheet("font: 75 26pt "Segoe Print";
""color:rgb(255, 85, 0);
""text-align:center;
""letter-spacing:4pt;")self.label_2.setObjectName("label_2")self.line = QtWidgets.QFrame(self.centralwidget)self.line.setGeometry(QtCore.QRect(10, 120, 961, 20))self.line.setFrameShape(QtWidgets.QFrame.HLine)self.line.setFrameShadow(QtWidgets.QFrame.Sunken)self.line.setObjectName("line")self.line_2 = QtWidgets.QFrame(self.centralwidget)self.line_2.setGeometry(QtCore.QRect(10, 200, 961, 16))self.line_2.setFrameShape(QtWidgets.QFrame.HLine)self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)self.line_2.setObjectName("line_2")self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_3.setGeometry(QtCore.QRect(170, 150, 321, 41))self.lineEdit_3.setObjectName("lineEdit_3")self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_3.setGeometry(QtCore.QRect(530, 150, 151, 41))self.pushButton_3.setStyleSheet("font: 22px;")self.pushButton_3.setObjectName("pushButton_3")self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_4.setGeometry(QtCore.QRect(730, 150, 151, 41))self.pushButton_4.setStyleSheet("font:22px;")self.pushButton_4.setObjectName("pushButton_4")self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setGeometry(QtCore.QRect(50, 270, 411, 421))self.label_3.setStyleSheet("font:28px;
""border-style:solid;
""border-width:1px;
""border-color:rgb(45, 45, 45);
""
""")self.label_3.setText("")self.label_3.setObjectName("label_3")self.label_4 = QtWidgets.QLabel(self.centralwidget)self.label_4.setGeometry(QtCore.QRect(540, 270, 401, 421))self.label_4.setStyleSheet("font:28px;
""border-style:solid;
""border-width:1px;
""border-color:rgb(45, 45, 45);
""
""")self.label_4.setText("")self.label_4.setObjectName("label_4")self.label_5 = QtWidgets.QLabel(self.centralwidget)self.label_5.setGeometry(QtCore.QRect(220, 230, 91, 31))self.label_5.setStyleSheet("font: 14pt "Arial";")self.label_5.setObjectName("label_5")self.label_6 = QtWidgets.QLabel(self.centralwidget)self.label_6.setGeometry(QtCore.QRect(710, 230, 72, 31))self.label_6.setStyleSheet("font: 14pt "Arial";")self.label_6.setObjectName("label_6")self.label.raise_()self.pushButton_2.raise_()self.line.raise_()self.line_2.raise_()self.label_2.raise_()self.lineEdit_3.raise_()self.pushButton_3.raise_()self.pushButton_4.raise_()self.label_3.raise_()self.label_4.raise_()self.label_5.raise_()self.label_6.raise_()MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 994, 26))self.menubar.setObjectName("menubar")self.menutest2 = QtWidgets.QMenu(self.menubar)self.menutest2.setObjectName("menutest2")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.actiondemo1 = QtWidgets.QAction(MainWindow)self.actiondemo1.setObjectName("actiondemo1")self.actiondemo2 = QtWidgets.QAction(MainWindow)self.actiondemo2.setObjectName("actiondemo2")self.menutest2.addAction(self.actiondemo1)self.menutest2.addAction(self.actiondemo2)self.menubar.addAction(self.menutest2.menuAction())self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)# 按钮关联函数self.pushButton_2.clicked.connect(self.openImage)self.pushButton_3.clicked.connect(self.startAction)self.pushButton_4.clicked.connect(self.saveImage)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "素描图像"))self.pushButton_2.setText(_translate("MainWindow", "选择图片"))self.label_2.setText(_translate("MainWindow", "素描图像生成器"))self.pushButton_3.setText(_translate("MainWindow", "开始"))self.pushButton_4.setText(_translate("MainWindow", "保存"))self.label_5.setText(_translate("MainWindow", "原图像"))self.label_6.setText(_translate("MainWindow", "素描图"))self.menutest2.setTitle(_translate("MainWindow", "test2"))self.actiondemo1.setText(_translate("MainWindow", "demo1"))self.actiondemo2.setText(_translate("MainWindow", "demo2"))# 选择本地图片上传def openImage(self):global imgNamepath  # 这里为了方便别的地方引用图片路径,将其设置为全局变量# 弹出一个文件选择框,第一个返回值imgName记录选中的文件路径+文件名,第二个返回值imgType记录文件的类型# QFileDialog就是系统对话框的那个类第一个参数是上下文,第二个参数是弹框的名字,第三个参数是默认打开的路径,第四个参数是需要的格式imgNamepath, imgType = QFileDialog.getOpenFileName(self.centralwidget, "选择图片","D:\python\RRJ\pycharmproject\Practice\chep2\Image","*.jpg;;*.png;;All Files(*)")# 通过文件路径获取图片文件,并设置图片长宽为label控件的长、宽img = QtGui.QPixmap(imgNamepath).scaled(self.label_3.width(), self.label_3.height())# 在label控件上显示选择的图片self.label_3.setPixmap(img)# 显示所选图片的路径self.lineEdit_3.setText(imgNamepath)# 保存图片到本地(第二种方式:首先提取相对应Qlabel中的图片,然后打开一个保存文件的弹出框,最后保存图片到选中的路径)def saveImage(self):# 提取Qlabel中的图片img = self.label_4.pixmap().toImage()fpath, ftype = QFileDialog.getSaveFileName(self.centralwidget, "保存图片", "d:\", "*.jpg;;*.png;;All Files(*)")img.save(fpath)# 生成素描图def startAction(self):img = cv2.imread(imgNamepath)img = cv2.resize(img, dsize=(768, 1080))# 图像转灰度图像gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 灰度图像到反转灰度图像inverted_gray_image = 255 - gray_image# 模糊倒置灰度图像blurred_inverted_gray_image = cv2.GaussianBlur(inverted_gray_image, (19, 19), 0)# 反转模糊图像inverted_blurred_image = 255 - blurred_inverted_gray_image# 准备照片素描sketck = cv2.divide(gray_image, inverted_blurred_image, scale=256.0)path = "D:\python\RRJ\pycharmProject2\zhanCunDiZhi\"# 因为不知道怎么将<class 'numpy.ndarray'>转换为<class 'PyQt5.QtGui.QPixmap'>类型,因此采用暂存再读出的方式cv2.imwrite(path + 'ZC.jpg', sketck)# pyqt5从路径读取图片imgShow = QPixmap(path + 'ZC.jpg')self.label_4.setScaledContents(True)self.label_4.setPixmap(imgShow)

对应的界面:

(第二个界面)登录界面对应的后端代码:enterTest2.py

import test2
from PyQt5.QtWidgets import QApplication, QMainWindowclass SecondWindowActions(test2.Ui_MainWindow,QMainWindow):def __init__(self):super(test2.Ui_MainWindow,self).__init__()self.setupUi(self)

4.3 主函数

# 这是一个示例 Python 脚本。# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialogfrom enterTest1 import FirstWindowActionsif __name__ == '__main__':# 界面的入口,在这里需要定义QApplication对象,之后界面跳转时不用重新定义,只需要调用show()函数jiktapp = QApplication(sys.argv)# 显示创建的界面MainWindow = FirstWindowActions()  # 创建窗体对象MainWindow.show()  # 显示窗体sys.exit(app.exec_())  # 程序关闭时退出进程

五、测试分析

5.1 结果展示

因为只是一个测试,因为没有实现相关注册登录的验证,点击登录进入操作界面,选择一幅图像:

点击开始得到结果:

保存结果:

5.2 结果分析

通过测试发现基本完成素描图像生成,也练习了PyQt的相关组件,但是仍然存在太多缺陷,组件不能自适应窗口,尝试过布局解决,但由于不熟练失败了,也没有练习菜单功能,同样确少返回一个个界面,即重新登录的操作。后面将改进打包成一个可执行的.exe文件。


总结

参考文章:

(1)pyqt5安装与pycharm配置_DonLex的博客-CSDN博客_pyqt5安装

(2)???pyqt5:利用QFileDialog从本地选择图片文本文档显示到label、保存图片label文本到本地(附代码)_桥本环奈粤港澳分奈的博客-CSDN博客_pyqt5保存图片到本地

(3)pyqt5:利用QFileDialog从本地选择图片文本文档显示到label、保存图片label文本到本地(附代码)_桥本环奈粤港澳分奈的博客-CSDN博客_pyqt5保存图片到本地

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像相关推荐

  1. Win10文件夹中图片不显示预览图解决方法

    Win10文件夹中图片不显示预览图解决方法分享.如果我们在文件夹里面有很多的图片文件,可以通过预览图来快速的找到自己需要的图片.但是有用户却发现电脑文件夹里面图片不会显示缩略图,今天我们一起来看看如何 ...

  2. Html读取本地文件夹下图片并显示的示例代码

    一 目的 在Html上选择本地文件夹,自动读取文件夹及子文件夹下的所有图片并显示在页面. 技术分析: 存在问题 Html中file标签获取到的路径时相对的. Html中Img指定源时需要的是绝对路径. ...

  3. 自动展示目录下的图片html,Html读取本地文件夹下图片并显示

    一 目的 在Html上选择本地文件夹,自动读取文件夹及子文件夹下的所有图片并显示在页面. 技术分析: 存在问题 Html中file标签获取到的路径时相对的. Html中Img指定源时需要的是绝对路径. ...

  4. opencv 入门笔记九 文件夹读取图片序列并视频播放

    1.代码 #!/usr/bin/python3import cv2 as cv import os# 图片文件夹 dir_path = "/home/newj/下载/Basketball/i ...

  5. python 从文件夹读取图片

    最近开始搞图片检索 * coding=utf-8 * from math import sqrt import cv2 import time import os import numpy as np ...

  6. 【pyQT5】Python3+pyQT5开发环境安装与配置

    在PyQt中编写UI界面可以直接通过代码来实现,也可以通过Qt Designer来完成.Qt Designer的设计符合MVC的架构,其实现了视图和逻辑的分离,从而实现了开发的便捷. Qt Desig ...

  7. Qt 杂记 —— Qt安装并配置调试文件,添加源码调试pdb文件

    文章目录 Qt 杂记 -- Qt安装并配置调试文件,添加源码调试pdb文件 一.安装QT及QTCreator 二.在VS中使用QT 个人格言 Qt 杂记 -- Qt安装并配置调试文件,添加源码调试pd ...

  8. Django从理论到实战(part18)--配置templates文件夹路径

    学习笔记,仅供参考 参考自:Django打造大型企业官网: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的记 ...

  9. python找不到scripts文件夹_快速解决安装python没有scripts文件夹的问题

    安装Python2.7,好多次都不会产生scripts文件夹,导致无法使用pip. 折腾了一下,找到了解决办法. 让人无法接受的是,只要是我给的安装包一定不会产生scripts文件夹,所以应该是我的安 ...

最新文章

  1. 在linux上安装cuda的时候报错:Existing package manager installation of the driver found.
  2. 关于.NET下开源及商业图像处理(PSD)组件
  3. Making the Grade POJ - 3666(离散化+dp)
  4. visual studio 的各个版本下载地址
  5. 填平数据、产品、模式需求鸿沟,浪潮云发布新一代行业云 MEP战略
  6. 什么标签用于在表单中构建复选框_基础表单标签及属性
  7. 【报告分享】智能时代的商业地产数字变革与发展报告.pdf(附下载链接)
  8. 计算机维修 主板 打印机,一台电脑带电拨打印机接口 ,烧坏主板,不能开机
  9. 如何关联php5与apche,PHP5在Apache下的两种模式的安装_php
  10. oracle 删除xml记录,Oracle之xml的增删改查操作
  11. [Xamarin] 客製化的ListView之章 (转帖)
  12. 现代软件工程_项目回顾模板
  13. 寻找春天nbsp;九宫格日记-2011.04.17
  14. Excel文件加密后忘记密码 - 破解方法
  15. linux下ftp客户端主动模式设置
  16. gcc10环境下bwa安装报错的解决方案
  17. FPGA同步复位、异步复位、异步复位同步释放
  18. java从输入中获取经纬度_java从百度后台接口获取经纬度
  19. 《安富莱嵌入式周报》第293期:SEGGER开源其C/C++库源码emRun,丰富EMC电磁兼容资,OTA开源组件,2022 Github全球报告,内存安全指南
  20. 我的世界java版1.7.10咋刷物品,我的世界1.7.10刷物品mod

热门文章

  1. 网易云信的音频共享技术 | 体验共享专题
  2. 数字化转型时代,如何让你的 App 摆脱“内卷”?
  3. 如有回忆,我情愿和你化作一团火焰!
  4. 期货反向跟单-聊点感悟
  5. 华为Mate 20X首发,九月手机厂商5G手机大爆发,小米MIX4配置曝光
  6. 温故而知识--历史清单
  7. Go 开源项目推荐:一个简单的 Go 练手项目
  8. ASP.NET Calendar 控件在中文服务器上显示为英文星期的处理
  9. 电信公司Mahindra Comviva利用VoltActiveData来部署实时客户价值
  10. 写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串