pyqt使用小结

一.界面的转换与实例化

1.首先用Qt Creator 创建一个.ui文件,Qt Creator 是可视化的。
在这里插入图片描述
如图,界面布局完成后点击文件选项卡中的保存。
2.进入到.ui文件所在的文件夹
在这里插入图片描述
在地址栏输入cmd进入命令窗口。
在这里插入图片描述
输入转换代码

pyuic5 -o [转换后的文件名].py [想转换的文件名].ui

在这里插入图片描述
这时候回到原来文件夹目录中
在这里插入图片描述
.ui文件成功转化成了Python文件,成了被封装好的一个窗口类。
3.新建一个Python文件输入以下代码

# coding = utf-8
from locationui import Ui_MainWindow  # 这个是在上文中生成的界面Python文件
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5 import  QtWidgets

class window(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(window, self).__init__()
        self.setupUi(self)   #实例化后可以直接在windows类中直接定义事件操作

if __name__ == "__main__":
    app = QApplication(sys.argv)  # 创建一个应用
    window = window()   # 实例化窗口
    window.show()       # 窗口展示
    sys.exit(app.exec_())  # 退出关闭应用

运行后效果:
在这里插入图片描述
做到这一步,恭喜你完成的流程走下来了!接下来就是熟悉控件以及事件操作了!

二.控件之Graphics View

使用Graphics View之前需要安装opencv3,使用cv2.imread()函数导入图像,需要进行颜色通道的转换.

pip install opencv-python

在Graphics View显示图片基础代码如下(’‘1.jpg’'换成想换的图片路径)

        jpg = QPixmap("1.jpg").scaled(self.maps.width() - 6, self.maps.height() - 6)
        self.item = QGraphicsPixmapItem(jpg)  # 创建像素图元
        self.scene = QGraphicsScene()         # 创建场景
        self.scene.addItem(self.item)         # 添加图元到场景中
        self.maps.setScene(self.scene)        # 添加场景到视图
        self.maps.centerOn(0,0)               # 设置view的显示中心

1)self.scene = QGraphicsScene() 也可以如下操作
self.scene = QGraphicsScene(float,float ,float ,float) 直接限定了场景的左上角坐标以及场景矩形框的长和宽,也可以用Qrect 来代替这四个数
QRect,相当于QPoint+QSize
2)最后一行代码是为了场景大于视图的时候能控制滚动条,让视图切到以场景中坐标为(x,y)的中心的显示效果,(0,0)显示的是左上角。这里就不截图了。

难点:
在这里插入图片描述
GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显示及与外界进行交互,主要提供图元的操作接口、传递事件和管理各个图元状态,提供无变换的绘制功能(如打印);QGraphicsView提供一个可视的窗口,用于显示场景中的图元,一个场景中可以有多个视图。
坐标轴:场景坐标轴,视图坐标轴,图元坐标轴
获得场景坐标

print(self.scene.sceneRect().x())
print(self.scene.sceneRect().y())   # 可供调试

获得图元坐标

print(self.item.pos().x())
print(self.item.pos().y())

图元创建
常见的图元:
QGraphicsSimpleTextItem:提供了一个简单的文本标签项
QGraphicsTextItem:提供了一个格式化的文本项
QGraphicsLineItem:提供了一个直线项
QGraphicsPixmapItem:提供了一个图像项
QGraphicsRectItem:提供了一个矩形项
QGraphicsEllipseItem:提供了一个椭圆项
QGraphicsPathItem:提供了一个路径项
QGraphicsPolygonItem:提供了一个多边形项
QGraphicsSvgItem :提供了svg格式加载项
以椭圆为例

self.item1 = QGraphicsEllipseItem(0,0,10,100)  # 创建像素图元 10是长轴 100是短轴 两个参数相同时为圆
self.item1.setPos(100,100)  # 设置在场景中的位置
self.scene.addItem(self.item1) # 添加到场景中

效果如下
在这里插入图片描述
当然想添加颜色的话可以这么做

self.item1 = QGraphicsEllipseItem(0,0,10,100)
self.pen = QPen()  # 描边设置
self.pen.setWidth(1)   # 粗细
self.pen.setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256)) # 随机应用色彩
self.item1.setPen(self.pen)     # 应用到图元中
self.item1.setPos(100,100)     # 设置在场景中的位置
self.item1.setBrush(QColor(130,10,100))   # 固定上色   也可以用 QColor(qrand() % 256, qrand() % 256, qrand() % 256) 进行随机上色
self.scene.addItem(self.item1)

效果如下:
在这里插入图片描述
到这里我们就知道如何创建、设置并显示简单的图元了!

三.Label

Label是pyqt中最常见的显示控件,它的用途十分广泛

Label显示文字

label.text() # 获取label内容
label.setText() # 设置label中的内容

Label事件响应

在这里插入图片描述用下面代码发送信号

label.linkHovered.connect(self.link_hovered)#针对链接光标略过
label.linkActivated.connect(self.link_clicked)#针对链接点击事件

再配上对应的槽函数便完成了一个事件

Label显示图片

使用label控件显示图片

jpg = QPixmap("cat.png").scaled(self.outputm.width(), self.outputm.height())
self.outputm.setPixmap(jpg)

(其中QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,通常是标签或者按钮,用于在标签或按钮上显示图像
QPixmap可以读取的图像文件类型有BMP,GIF,JPG等)
代码中’‘cat.png’'改成相同目录下所需要的文件名或者绝对路径。
当然也可以直接点击按钮弹出选项框选择

# 对话框可视化操作
imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "","*.jpg;;*.png;;All Files(*)")
jpg = QPixmap(imgName).scaled(self.outputm.width(), self.outputm.height())
        self.outputm.setPixmap(jpg)

便会产生对话框点击图片就行。
在这里插入图片描述

四.Menu 和action

在Qdesigner设计的时候,我们能发现有菜单栏。下面来说说基本使用:
首先双击输入想输入的名字:
在这里插入图片描述
然后保存更新ui文件后将更新添加到py文件中去(记得将Object名字改成自己想要的)。然后在python中添加action代码:

self.database.triggered.connect(self.condabase)
def condabase(self):
	# 设定相应的事件
	pass

注意:这里虽然也是点击,但是不能用clicked,应用triggered。

五.多线程

为了防止应用程序不被卡死,引入多线程的概念

from PyQt5 import QCore  
class WorkThread(QCore.QThread):
    trigger = pyqtSignal()   
    # 括号中可以输入信号的类型 比如:trigger = pyqtSignal(str,str)
    # 那么下面self.trigger.emit(c1,c2) 注意c1c2是变量名,而上面的str是数据类型
    def run(self):
        #这一部分就可以写入想要执行的代码
        # 运行完毕或者运行过程中发出信号
        self.trigger.emit()

workThread=WorkThread()  #实例化一个线程对象
workThread.trigger.connect(self.timeStop1)  #链接你执行完这个线程之后的想要触发的 函数的名字
workThread.start()  #这个就是启动线程

注意上面的库声明是正确的 但是如果换一个可能会报错:
‘NoneType’ object has no attribute ‘QThread’

程序打包

在所需要打包的py文件目录中进入terminal,输入

pyinstaller -F [所要打包的文件].py

提前需安装pyinstaller的包,pip就可以了。
在安装的过程中出现一些小问题,下面进行列举,并讲述解决方案
1)AttributeError: ‘str’ object has no attribute ‘items’
原因:setuptools包没有最新,更新到40版本就好
解决方法:重新安装uninstall后再install
2)双击后Failed to execute script XXXXXXX
原因:有些包没有正常导入导致无法运行
解决方法:打开terminal,将dist中的.exe文件拖入terminal中,按下回车运行。运行中会报错:no module named XXXX,然后到相应的python安装目录下进入->Lib->sitepackages(里面是你安装的包),根据报错中所缺失的包将它们复制到.exe文件同级目录下。
3)图片缺失
图片进行相对定位,将图片或者资源文件夹复制到同级目录下
!!!重点来了!!!
当环境中其他无用的包数量很多时会让打出来的包文件很大,除了新建一个容器以外还可以死使用虚拟环境进行安装
安装虚拟环境
pip install pipenv

启用虚拟环境
pipenv install

进入虚拟环境
pipenv shell

安装模块,如果报错说明不用安装。经过测试,os sys csv string不用安装
pip install chardet openpyxl
pip install pyinstaller

开始打包。xxx.py是你的py程序
pyinstaller -F xxx.py

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值