PySide6复杂C/S系统开发

news2024/11/24 12:11:04

PySide6复杂C/S系统开发

目录

0.了解

1.前提

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


0.了解

        之前写了一篇“PySimpleGUI复杂C/S系统开发”博客(由于pysimplegui更改了协议,因此不再推荐,用了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.实际代码(继承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, QPainter

class 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 = False
        self.start_pos = None
        self.current_rect = None
        self.cross_marking_line = None
 
    def wheelEvent(self, event):
        if not self.scene():
            return
        if len(self.scene().items()) == 0:
            return
        curPoint = event.position() # QPointF
        scenePos = self.mapToScene(curPoint.toPoint())
        viewWidth = self.viewport().width()
        viewHeight = self.viewport().height()
        hScale = curPoint.x() / viewWidth
        vScale = curPoint.y() / viewHeight
        wheelDeltaValue = event.angleDelta().y() # 120
        scaleFactor = self.transform().m11()  # 等比例缩放 所以只需要m11 x轴缩放比例
        if (scaleFactor < 0.05 and wheelDeltaValue < 0) or (scaleFactor > 50 and wheelDeltaValue > 0):
            return
        if 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 = False
            if self.current_rect:
                self.current_rect = None
            self.start_pos = None

        if 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 = None

        super().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())

        
        


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transiting from CUDA to HIP (二)

一、Identifying Architecture Features 1. HIP_ARCH Defines 在 CUDA 编程中&#xff0c;__CUDA_ARCH__ 是一个预定义的宏&#xff0c;用于指示当前编译的代码所针对的 NVIDIA GPU 的计算能力&#xff08;Compute Capability&#xff09;。开发者可以使用这个宏来编写条件代…

Xinstall助力App推广:全方位支持,精准数据分析,你值得拥有

在如今的移动互联网时代&#xff0c;App推广已成为每个应用开发者必须面对的重要课题。然而&#xff0c;推广过程中往往伴随着诸多痛点&#xff0c;如数据混乱、投放盲目、决策滞后以及作弊困扰等。这些问题不仅影响了推广效果&#xff0c;还可能导致资源的浪费和投入产出不均衡…

数据安全认证来了解一下

随着数据安全法及个人信息保护法的实施&#xff0c;数据安全相关岗位在安全行业变得极为热门。 根据数据安全法第二十条&#xff0c;国家鼓励教育、科研机构和企业等开展数据开发利用技术和数据安全相关的教育和培训&#xff0c;采用多种途径培育专业人才&#xff0c;促进人才…

【Linux】使用Linux实现小程序 - 进度条

目录 一、缓冲区二、回车换行的概念三、进度条的设计3.1 版本1&#xff08;没有配合场景&#xff09;3.2 版本2&#xff08;配合场景&#xff09;3.3 版本3&#xff08;美化进度条&#xff09; 结尾 一、缓冲区 C/C语言&#xff0c;会针对标准输出&#xff0c;给我们提供默认的…

c++----杨辉三角(补充)

大家好。今天我给大家带来的是&#xff0c;我们以前讨论过的知识点。杨辉三角。我相信大家在c的学习中已经清楚的了解和认识到了杨辉三角的实现逻辑和实现方法了。但是应该大多局限于在c中吧。我们都知道我们c与c其实在一些地方是可以相互成就的。那么我们在c中的经典题目杨辉三…

自定义实现log4j的appender

log4j&#xff0c;应用最广泛的日志框架。其作者后来推出logback&#xff0c;也是好选择。不多说废话。 log4j组件介绍 Log4j主要有三个组件&#xff1a; Logger&#xff1a;负责供客户端代码调用&#xff0c;执行debug(Object msg)、info(Object msg)、warn(Object msg)、err…

oracle----undo表空间

文章目录 undo表空间概念和作用undo表空间主要用于解决&#xff1a;1.1 读一致性1.2 回滚事务1.3 实例恢复 undo表空间操作查看UNDO表空间查看UNDO 参数查看undo表空间文件位置 undo表空间概念和作用 对于DML语句&#xff0c;只要修改了数据块&#xff0c;数据库就会把修改前的…

使用Amazon SageMaker JumpStart微调Meta Llama 3.1模型以进行生成式AI推理

文章目录 使用Amazon SageMaker JumpStart微调Meta Llama 3.1模型以进行生成式AI推理Meta Llama 3.1SageMaker JumpStartSageMaker JumpStart中Meta Llama 3.1模型的微调配置使用SageMaker JumpStart UI进行无代码微调使用SageMaker JumpStart SDK进行微调结论 使用Amazon Sage…

电商数据整合新篇章:京东商品详情API返回值应用实践

电商数据整合在当今商业环境中具有重要地位&#xff0c;API&#xff08;应用程序编程接口&#xff09;提供了高效收集、整合和分析数据的途径。以京东商品详情API为例&#xff0c;通过其返回值&#xff0c;电商企业可以构建更精准的营销策略、优化产品以及提升用户体验。以下是…

实例分割【YOLOv8版】

参考文档 Segment - Ultralytics YOLO Docs​docs.ultralytics.com/tasks/segment/ 何为实例分割&#xff1f; 实例分割比目标检测更进一步&#xff0c;涉及识别图像中的各个对象并将它们与图像的其余部分分割开来。 实例分割模型的输出是一组用于勾勒图像中每个对象的掩码…

回溯法-图的m着色问题

图的 m 着色问题 问题描述 给定一个无向连通图 ( G (V, E) ) 和 ( m ) 种颜色&#xff0c;我们的任务是为图 ( G ) 的每个顶点着色&#xff0c;使得相邻的顶点颜色不同。如果存在这样的着色方案&#xff0c;我们称之为图 ( G ) 的 ( m ) 可着色问题。 算法思路 初始化&…

Sentence-BERT实现文本匹配【回归目标函数】

引言 上篇文章我们通过Sentence-Bert提出的分类目标函数来训练句子嵌入模型&#xff0c;本文同样基于Sentence-Bert的架构&#xff0c;但改用回归目标函数。 架构 如上图&#xff0c;计算两个句嵌入 u \pmb u u和 v \pmb v v​之间的余弦相似度&#xff0c;然后可以使用均方误…

如何通过住宅代理优化SERP表现:提升SEO排名的实用指南

引言 什么是SERP&#xff1f;包含哪些内容&#xff1f; 为什么SERP对SEO至关重要&#xff1f; 如何优化SERP表现&#xff1f; 总结 引言 在当今竞争激烈的数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为企业提升在线可见性和吸引有机流量的关键…

matlab2024a/2023/2022/2020/matlab2019 如何plot画局部放大图(已解决)

matlab 2024&#xff1b;matlab 2023&#xff1b;matlab 2022&#xff1b;matlab 2021&#xff1b;matlab 2020&#xff1b;matlab 2019 matlab 2017一下的 使用magnify.m 进行局部放大图操作是没有问题的。 新版本 采用magnify.m 很难操作。 为什么要局部放大 局部方…

【王树森】Few-Shot Learning (3/3):Pretraining + Fine Tuning(个人向笔记)

Preliminary Few-Shot Learning 很简单&#xff0c;但是却能达到比较高的准确度&#xff0c;相反一些复杂的模型反而不能达到很高的准确率 1. Cosine Similarity 余弦相似度可以衡量两个向量的相似度 假设两个向量的长度都是1&#xff1a;那么它们余弦相似度的计算方法如下…

HarmonyOS开发实战( Beta5版)线程间通信场景最佳实践

简介 在应用开发中&#xff0c;经常会需要处理一些耗时的任务&#xff0c;如果全部放在主线程中执行就会导致阻塞&#xff0c;从而引起卡顿或者掉帧现象&#xff0c;降低用户体验&#xff0c;此时就可以将这些耗时操作放到子线程中处理。通常情况下&#xff0c;子线程可以独立…

bcftools报错|The sequence “chr1“ not defined in the header: chr1.recode.vcf

1、报错信息 The sequence "chr1" not defined in the header: chr1.recode.vcf (Quick workaround: index the file.) 所使用的命令&#xff0c;目的是想合并所提取的特定染色体。 bcftools concat -O v / -o varscan.indel_merged.vcf chr1.recode.vcf chr2.reco…

超好用的图纸加密软件排行榜 | 2024图纸加密软件的七款最优选择!

数字化设计日益普及的今天&#xff0c;图纸作为设计与工程的核心载体&#xff0c;其安全性成为了企业和设计师们最为关注的焦点之一。 面对日益复杂的数据泄露风险&#xff0c;如何有效地保护图纸文件的安全呢&#xff1f; 下面&#xff0c;我们就来探讨一下2024图纸加密软件的…

Python的10个文件对比与合并高效策略

文末赠免费精品编程资料~~ 在日常编程或数据分析工作中&#xff0c;经常需要处理多个文件的对比与合并任务。Python因其强大的文件处理能力和丰富的库支持&#xff0c;成为了处理这类任务的理想选择。下面&#xff0c;我们将逐步探索10种高效的文件对比与合并策略&#xff0c;…

OpenGL/GLUT实践:粒子系统,并添加纹理、动态模糊、边界碰撞(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub&#xff1a;A-UESTCer-s-Code 文章目录 1 运行效果2 实验过程2.1 基本粒子系统2.1.1 定义粒子结构2.1.2 创建粒子并初始化2.1.2.1 创建粒子2.1.2.2 初始化 2.1.3 粒子状态更新与绘制2.1.3.1 绘制2.1.3.2 更新 2.1.4 实现效果 2.2 添加纹理2.2.1 纹理添加2.2.2 渲染…