当前位置: 首页 > news >正文

PySide6复杂C/S系统开发

PySide6复杂C/S系统开发

目录

0.了解

1.前提

2.qtdesigner使用

3.实际代码(继承QGraphicsview修改)

4.效果图


0.了解

        之前写了一篇“PySimpleGUI复杂C/S系统开发”博客(由于pysimplegui更改了协议,因此不再推荐,并且pypi上也撤销了4.60.5,国内源还有。用了pyside6后yyds),里面介绍了几款python的GUI,但是漏掉了wxpython,它也很不错。wxpython是wxwidgets(c++)的python接口,支持跨平台,并且由于底层是c++其性能也很强。另外wxpython或wxwidgets的UI设计器也是有的,叫wxFormBuilder。

        不过多介绍PyQt系列,它与PySide系列功能99%的都相同,但是协议不一样,PySide6在不重新编译的前提下,可直接商用,而pyqt不行,并且pyside6是QT官方python API库。

        如果想实现酷炫的界面,推荐web(b/s)系统;如果必须要用c/s系统且用pyside6时,那么也可以实现酷炫的界面,了解qss(不推荐),qt官方好像在推qml(个人不推荐),qtwidgets官方更新比较少了,因为其界面一般,但是功能稳定强悍。

        个人需求:普通界面,实现复杂功能、要求性能强且用python时,推荐PySide6!!!

1.前提

        PySide6官方文档链接,不太喜欢很多人推荐的zeal的qt文档,明明有qt py api的文档。

        可以去B站看看pyside6的教程视频,一开始都推荐手写代码,看了1天后,明白个大概,随用随搜随学吧。

        qt-designer,在安装的PySide6包路径下有designer.exe,网上一堆vscode配置qtdesigner的教程,个人还是喜欢直接双击用。另外将ui文件转成py文件或者cpp文件,在py下采用命令

pyside6-uic xxx.ui -o xxx.py,即可,然后推荐继承类的写法再进行功能开发。

2.qtdesigner使用

        ①了解信号与槽的机制

        ②了解垂直、水平、栅格布局,了解容器(可以跟随窗口大小变化),了解弹簧,其它的组件随用随搜,官网文档都有,看一下。

        另外gpt等大模型生成一些代码,稍微复杂点都得需要改。

3.实际代码(继承QGraphicsview修改)

        基于QGraphicsview,重写几个事件函数(鼠标按下、释放、平移、滚轮、重画),以实现显示图像,矩形框的绘制,选择平移删除,以及十字标线的显示!!!ImageView参考的一篇博客。

from PySide6.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsItem
from PySide6.QtCore import Qt, QRectF, QPointF, QSize, QSizeF
from PySide6.QtGui import QPen, QColor, QBrush, QPainterclass ImageView(QGraphicsView):# 增加1个parent 以实现源码中的init parent参数,将graphicsview放到groupbox等容器中def __init__(self, parent):super().__init__(parent=parent)self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)  # 隐藏横向滚动条 开启self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)  # 隐藏纵向滚动条# self.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag)  # 启用拖动self.setDragMode(QGraphicsView.NoDrag)  # 禁用拖动self.setMouseTracking(True)self.data = []self.flag = Falseself.start_pos = Noneself.current_rect = Noneself.cross_marking_line = Nonedef wheelEvent(self, event):if not self.scene():returnif len(self.scene().items()) == 0:returncurPoint = event.position() # QPointFscenePos = self.mapToScene(curPoint.toPoint())viewWidth = self.viewport().width()viewHeight = self.viewport().height()hScale = curPoint.x() / viewWidthvScale = curPoint.y() / viewHeightwheelDeltaValue = event.angleDelta().y() # 120scaleFactor = self.transform().m11()  # 等比例缩放 所以只需要m11 x轴缩放比例if (scaleFactor < 0.05 and wheelDeltaValue < 0) or (scaleFactor > 50 and wheelDeltaValue > 0):returnif wheelDeltaValue > 0:self.scale(1.2, 1.2)else:self.scale(1.0 / 1.2, 1.0 / 1.2)viewPoint = self.transform().map(scenePos)self.horizontalScrollBar().setValue(int(viewPoint.x() - viewWidth * hScale))self.verticalScrollBar().setValue(int(viewPoint.y() - viewHeight * vScale))self.update()def mousePressEvent(self, event):if self.flag and event.button() == Qt.RightButton and self.scene():self.start_pos = event.position()if event.button() == Qt.LeftButton:self.setDragMode(QGraphicsView.ScrollHandDrag)super().mousePressEvent(event)def mouseReleaseEvent(self, event):if self.flag and event.button() == Qt.RightButton:self.flag = Falseif self.current_rect:self.current_rect = Noneself.start_pos = Noneif event.button() == Qt.LeftButton:self.setDragMode(QGraphicsView.NoDrag)super().mouseReleaseEvent(event)def mouseMoveEvent(self, event):# 标记十字标线self.cross_marking_line = event.position()#.toPoint()self.viewport().update() # 不可直接用self.update 不起作用if self.flag and event.buttons() == Qt.RightButton and self.scene():scene_start_pos = self.mapToScene(self.start_pos.toPoint())scene_end_pos = self.mapToScene(event.position().toPoint())if scene_start_pos.x() < scene_end_pos.x() and scene_start_pos.y() < scene_end_pos.y():rect = QRectF(scene_start_pos, scene_end_pos) # view scene之间需要坐标系转换if self.current_rect:self.scene().removeItem(self.current_rect)self.current_rect = self.scene().addRect(rect, pen=QPen(Qt.red, 1))self.current_rect.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True)  # 设置可选中 平移self.current_rect.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, True)# self.current_rect.setFlag(QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges, True)# self.current_rect.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsFocusable, True)self.update()else:if self.current_rect:self.scene().removeItem(self.current_rect)self.current_rect = Nonesuper().mouseMoveEvent(event)def paintEvent(self, event):super().paintEvent(event)if self.flag and self.scene():painter = QPainter(self.viewport())pen = QPen(Qt.red, 2)painter.setPen(pen)painter.drawLine(0, self.cross_marking_line.y(), self.viewport().width(), self.cross_marking_line.y())painter.drawLine(self.cross_marking_line.x(), 0, self.cross_marking_line.x(), self.viewport().height())

 主函数部分代码,Ui_MainWindow是ui转成py类

4.效果图

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java 常用并发队列- DelayQueue
  • 靶场战神为何会陨落?
  • IP地址查询功能详解—构建风险画像与代理识别
  • Type-C接口 未来发展趋势
  • 重拾英语,从头学起
  • 牛客std:pair,指针+递归+整体法的使用
  • 红黑树的插入 C++
  • tomcat架构设计分析,核心组件详解
  • 【C++】容器list常用接口详解
  • idea新建父工程和添加导入新模块的步骤
  • 关于STM32运行时卡住问题
  • Adobe DC 2022提示无法识别的错误 - 解决方案
  • C4 单细胞测序中,oligo文库 和 cDNA 文库 各自的功能和区别
  • 【Kubernetes知识点问答题】Service 发现
  • TPM在解决哪些类型的问题时最有效?
  • 【comparator, comparable】小总结
  • AngularJS指令开发(1)——参数详解
  • Apache的基本使用
  • C++入门教程(10):for 语句
  • Cookie 在前端中的实践
  • CSS实用技巧干货
  • git 常用命令
  • JavaScript学习总结——原型
  • SQLServer之创建显式事务
  • Vue.js 移动端适配之 vw 解决方案
  • 从0到1:PostCSS 插件开发最佳实践
  • 诡异!React stopPropagation失灵
  • 每天10道Java面试题,跟我走,offer有!
  • 排序算法之--选择排序
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 使用docker-compose进行多节点部署
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Hibernate主键生成策略及选择
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #pragma multi_compile #pragma shader_feature
  • (C++17) optional的使用
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (javascript)再说document.body.scrollTop的使用问题
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (笔记)M1使用hombrew安装qemu
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (七)Activiti-modeler中文支持
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)http协议
  • (状压dp)uva 10817 Headmaster's Headache
  • ***监测系统的构建(chkrootkit )
  • .NET CORE Aws S3 使用
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • @Async 异步注解使用
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告
  • [ai笔记4] 将AI工具场景化,应用于生活和工作