PyQt5可视化 7 饼图和柱状图实操案例 ②建表建项目改布局

news2024/12/28 22:27:50

 

目录

一、数据库建表

1 建表

2 插入数据

3 查看表数据

二、建立项目

1 新建项目

2 appMain.py

3 myMainWindow.py

4 myChartView.py

2.4.1 提升的后果

2.4.2 QmyChartView类说明

2.4.3 添加代码

三、修改myMainWindow.py程序,添加功能

1 打开数据库

2 生成分数数据

3.2.1 import新模块

3.2.2 在构造函数中设置数据模型,调用生成分数函数 

3.2.3 生成分数函数 

3.2.4 运行看看

3 统计各分数段人数

3.3.1 构造函数中调用

3.3.2 统计各分数段人数的函数 

3.3.3 运行看看 

四、窗体的布局

1 窗体大小变化时界面的变化

2 设置栅格布局

4.2.1 设置栅格布局

4.2.2 运行看看初始大小

4.2.3 放大到整个屏幕

3 打破布局

4 固定frameHead高度

5 设置栅格布局

4.5.1 设置前窗体的层次结构

4.5.2 改为栅格布局

4.5.3 运行看看

6 splitter布局

4.6.1当前的布局

4.6.2 运行中改变布局


一、数据库建表

1 建表

CREATE TABLE sanguozhi(
  姓名		VARCHAR(20)     PRIMARY KEY,
  统帅		DECIMAL(8,2)    NOT NULL,
  武力		DECIMAL(8,2)    NOT NULL,
  智力		DECIMAL(8,2)    NOT NULL,
  政治		DECIMAL(8,2)    NOT NULL,
  魅力		DECIMAL(8,2)    NOT NULL
)

2 插入数据

INSERT INTO sanguozhi VALUES('诸葛亮', 93, 38, 100, 96, 93)
INSERT INTO sanguozhi VALUES('张飞',   86,  98,  63, 22, 44)
INSERT INTO sanguozhi VALUES('赵云',   91,  96,  76, 65, 81)
INSERT INTO sanguozhi VALUES('曹操',   98,  72,  91, 94, 96)
INSERT INTO sanguozhi VALUES('吕布',   95, 100,  26, 13, 36)
INSERT INTO sanguozhi VALUES('貂蝉',   20,  26,  81, 65, 95)
INSERT INTO sanguozhi VALUES('小乔',   17,  13,  74, 68, 92)

3 查看表数据

二、建立项目

1 新建项目

2 appMain.py

新建文件appMain.py,内容如下

3 myMainWindow.py

新建文件myMainWindow.py,输入以下内容

4 myChartView.py

2.4.1 提升的后果

在Ui_MainWindow.py出现了刚刚设计提升时产生的类

现在来写这个类的代码

2.4.2 QmyChartView类说明

QChart和QChartView是基于Graphics View结构的绘图类

要对一个QChart图表进行鼠标和按键操作,需要在QChartView类里对鼠标和按键事件进行处理,这就需要自定义一个从QChartView继承的类

QmyChartView类是从QChartView类继承的用作图表的视图组件,实现了鼠标、按键事件的处理,能够在鼠标移动时发射信号mouseMove(),鼠标框选中一个矩形区域时放大显示此区域,通过按键进行图表缩放和移动操作

2.4.3 添加代码

三、修改myMainWindow.py程序,添加功能

1 打开数据库

def __openDB(self):         #打开数提库
        self.DB = QSqlDatabase.addDatabase("QODBC")
        self.DB.setDatabaseName("Driver={Sql Server};Server=localhost;Database=LYL16pyqt5;Uid=sa;Pwd=666666")
        if not self.DB.open():      #打开数据库
            QMessageBox.warning(self, "错误","打开数据库失败")

2 生成分数数据

3.2.1 import新模块

3.2.2 在构造函数中设置数据模型,调用生成分数函数 

 

3.2.3 生成分数函数 

def __generateData(self):        ##生成分数数据
        self.dataModel.clear()
        headerList=["姓名","统帅","武力","智力","政治","魅力","平均分"]
        self.dataModel.setHorizontalHeaderLabels(headerList)        #设置表头文字
        
        qryStudList=QSqlQuery(self.DB)      #学生信息列表
        qryStudList.exec("SELECT 姓名,统帅,武力,智力,政治,魅力 FROM LYL16sanguozhi")
        
        qryStudList.first()
        while(qryStudList.isValid()):       #当前记录有效
            itemList=[]
            studName=qryStudList.value("姓名")
            item=QStandardItem(studName)        #创建
            item.setTextAlignment(Qt.AlignCenter)
            itemList.append(item)       #添加到列表
            
            avgScore=0
            
            studTongshuai=qryStudList.value("统帅")
            item=QStandardItem("%.0f"%studTongshuai)       #创建
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags()&(not Qt.ItemIsEditable))
            itemList.append(item)       #添加到列表
            avgScore =avgScore+studTongshuai
            
            studWuli=qryStudList.value("武力")
            item=QStandardItem("%.0f"%studWuli)      #创建
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags()&(not Qt.ItemIsEditable))
            itemList.append(item)            #添加到列表
            
            avgScore =avgScore+studWuli
            studZhili=qryStudList.value("智力")
            item=QStandardItem("%.0f"%studZhili)        #创建
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags()&(not Qt.ItemIsEditable))
            itemList.append(item)            #添加到列表
            avgScore =avgScore+studZhili
            
            studZhengzhi=qryStudList.value("政治")
            item=QStandardItem("%.0f"%studZhengzhi)      #创建
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags()&(not Qt.ItemIsEditable))
            itemList.append(item)            #添加到列表
            avgScore =avgScore+studZhengzhi
            
            studMeili=qryStudList.value("魅力")
            item=QStandardItem("%.0f"%studMeili)        #创建
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags()&(not Qt.ItemIsEditable))
            itemList.append(item)            #添加到列表
            avgScore =avgScore+studMeili
            
            #创建平均分
            item=QStandardItem("%.1f"%(avgScore/ 5.0 ))
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags()&(not Qt.ItemIsEditable))     #平均分不允许编辅
            itemList.append(item)       #添加到列表
            self.dataModel.appendRow(itemList)      #添加到数据模型
            if not qryStudList.next():     #移动到下一条记录,并判断是否到末尾了
                break

3.2.4 运行看看

3 统计各分数段人数

3.3.1 构造函数中调用

3.3.2 统计各分数段人数的函数 

def __surveyData(self):     ##统计各分数段人数
        for i in range(1, 6):       #0姓名1统帅2武力3智力4攻治5魅力,range(1,6)即从1到5
            cnt50,cnt60,cnt70,cnt80,cnt90=0,0,0,0,0
            for j in range(self.dataModel.rowCount()):      #行数等于人数
                val=float(self.dataModel.item(j, i).text())#分数
                if val<60:
                    cnt50 =cnt50+1
                elif (val>=60 and val<70):
                    cnt60 =cnt60+1
                elif (val>=70 and val<80):      
                    cnt70 =cnt70+1
                elif(val>=80 and val<90):
                    cnt80 =cnt80+1 
                else:
                    cnt90 =cnt90+1
                
            item=self.ui.treeWidget.topLevelItem(0)     #第1行,60
            item.setText(i,str(cnt50))      #第i列
            item.setTextAlignment(i,Qt.AlignHCenter)
            
            item=self.ui.treeWidget.topLevelItem(1)     #第2行[60,70)
            item.setText(i, str(cnt60))     #第i列
            item.setTextAlignment(i, Qt.AlignHCenter)
            
            item=self.ui.treeWidget.topLevelItem(2)     #第3行[70,80)
            item.setText(i, str(cnt70))     #第i列
            item.setTextAlignment(i, Qt.AlignHCenter)
            
            item=self.ui.treeWidget.topLevelItem(3)     #第4行[80,90)
            item.setText(i, str(cnt80))     #第i列
            item.setTextAlignment(i, Qt.AlignHCenter)
            
            item=self.ui.treeWidget.topLevelItem(4)     #第5行[90.100]
            item.setText(i, str(cnt90))    #第i列
            item.setTextAlignment(i,Qt.AlignHCenter)

3.3.3 运行看看 

四、窗体的布局

1 窗体大小变化时界面的变化

拉大窗口看看 

好难看,窗口拉大,显示区域没有跟着变大 

2 设置栅格布局

4.2.1 设置栅格布局

在窗体空白处点击或者在右上角的对象选中窗体,选择栅格布局

设计界面效果如下,看上去不错

 

4.2.2 运行看看初始大小

不错不错

4.2.3 放大到整个屏幕

 

好难看,上面的frameHead不需要那么高。界面放大,frameHead、frameData,tabWidget都拉大了

3 打破布局

让布局变回原样 

 

4 固定frameHead高度

希望在窗口放大的时候,frameHead不放大,只是放大表格和图形显示区域

改frameHead的sizePolicy属性,当前这个属性是这样的

 

希望窗口扩大的时候,frameHead水平方向可以跟着放大,但垂直方向固定不动。修改策略 

5 设置栅格布局

4.5.1 设置前窗体的层次结构

可以看到,窗体从大的角度来看由两个部分组成,一部分是frameHead,另一部分是splitter(由frameData和tabWidget组成)

从界面上来看,frameHead占据了窗口上方的大部分,但并没有占满整个上面一条空间

4.5.2 改为栅格布局

改完frameHead的属性后,再把窗体设为栅格布局。窗体变成了这样

 

由于设置了栅格布局,而且frameHead的扩展策略是水平方向Prefered,所以frameHead霸占了整个窗体上部空间(如果水平是fixed的,那么不会占满)

4.5.3 运行看看

刚运行界面

 

放大到整个屏幕 

frameHead不会变太高了

6 splitter布局

4.6.1当前的布局

从当前布局可以看出,frameData和groupBoxGrade通过一个splitter,组合到一起。

splitter是分裂器,可以左右分割和上下分割,可以在两个可以自由改变大小的组件之间进行分割

4.6.2 运行中改变布局

拖完之后 

把屏幕放到最大 

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

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

相关文章

第十届省赛——8人物相关性分析(数组)

题目&#xff1a;试题 H: 人物相关性分析时间限制: 1.0s 内存限制: 512.0MB 本题总分&#xff1a;20 分【问题描述】小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob有多少次同时出现。更准确的说&#xff0c;小明定义 Alice 和 Bob“同时出现”的意思是&a…

微小目标识别研究(2)——基于K近邻的白酒杂质检测算法实现

文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现代码这部分是手动实现的&#xff0c;并没有直接调用相关的库完整的代码——调用ope…

千川投放50问(完)!如何跑出高投产?

第四十一问&#xff1a;计划初期成本很高&#xff0c;是否要关掉重新跑&#xff1f;首先看一下是不是初期回传延迟导致的成本偏高。如果成本没有高的&#xff0c;不建议暂停&#xff0c;先观察一段时间数据&#xff0c;给它一点学习时间。当系统积累过足够的模型之后&#xff0…

08-Oracle游标管理(定义,打开、获取数据及关闭游标)

目标 1.确定何时需要显示游标2.声明、打开和关闭显示游标3.从显示游标中提取数据4.了解与游标有关的属性5.使用游标FOR循环检索游标中的数据6.在游标FOR循环的子查询中声明游标7.评估使用逻辑运算符结合在一起的布尔条件游标 1、在使用一个PL/SQL块来执行DML语句或只返回一行结…

2月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年2月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01;此版本包括以下改进&#xff1a;从激活的终端启动 VS Code 时的自动选择环境 使用命令 Python: Create Environmen 时可选择需求文件或可选依赖项 预发布&#xff1a;改…

性能优化之HBase性能调优

HBase是Hadoop生态系统中的一个组件&#xff0c;是一个分布式、面向列存储的内存型开源数据库&#xff0c;可以支持数百万列&#xff08;MySQL4张表在HBase中对应1个表&#xff0c;4个列&#xff09;、超过10亿行的数据存储。可用作&#xff1a;冷热数据分离HBase适合作为冷数据…

坐标系、视窗体(裁剪区域),存储着色器

坐标系 两种常见的投影/坐标系&#xff0c;正交和透视&#xff0c;实际上只是特定的4x4变换矩阵。啥都不规定默认的就是-1.0~1.0的笛卡尔坐标系。 正交&#xff1a; 在opengl的核心框架下&#xff0c;没有提供任何内置渲染管线&#xff0c;所以在提交一个几何图形进行渲染之前&…

Ubuntu Protobuf 安装(测试有效)

安装流程 下载软件 下载自己要安装的版本&#xff1a;https://github.com/protocolbuffers/protobuf 下载源码编译&#xff1a; 系统环境&#xff1a;Ubuntu16&#xff08;其它版本亦可&#xff09;&#xff0c;Protobuf-3.6.1 编译源码 cd protobuf# 当使用 git clone 下来的…

【C语言】操作符详解总结(万字)

操作符详解1. 操作符分类2. 算术操作符3. 移位操作符3.1 整数的二进制是怎么形成的3.2 左移操作符3.3 右移操作符4. 位操作符5. 赋值操作符6. 单目操作符6.1 单目操作符介绍6.2 sizeof 和 数组7. 关系操作符8. 逻辑操作符9. 条件操作符9.1 练习19.2 练习210. 逗号表达式11. 下标…

【Vue】vue2导出页面内容为pdf文件,自定义选中页面内容导出为pdf文件,打印选中页面内容,预览打印内容

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、安装html2canvas和jspdf二、导出pdf使用步骤1.在utils文件夹下创建htmlToPdf.js2.在main.js中引入3.在页面中使用三、打印预览1. 引入print-js2.页面中impor…

PG数据库实现高可用方案(包括通用型方案Corosync+pacemaker协作)

实现高可用方案首先了解一下高可用集群高可用&#xff1a;透明切换&#xff0c;故障切换&#xff0c;连接管理器/集群管理器pgpool-Ⅱ&#xff1a;连接池、复制、负载均衡功能PatroniCorosyncpacemaker高可用解决方案Corosyncpacemakercorosyncpacemaker架构协作资源分配&#…

功耗降低99%,Panamorph超清VR光学架构解析

近期&#xff0c;投影仪变形镜头厂商Panamorph获得新型VR显示技术专利&#xff08;US11493773B2&#xff09;&#xff0c;该专利方案采用了紧凑的结构&#xff0c;结合了Pancake透镜和光波导显示模组&#xff0c;宣称比传统VR方案的功耗、发热减少99%以上&#xff0c;可显著提高…

通讯录(C++实现)

系统需求通讯录是一个可以记录亲人、好友信息的工具。本章主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人显示联系人:显示通讯录…

【006】Redis主从/哨兵/分片集群Docker搭建

项目源码合集 https://gitee.com/qiuyusy/small-project-study 搭建过程疯狂踩坑,记录一下希望各位少走弯路 目录主从搭建配置文件redis.conf运行容器测试优化哨兵集群配置文件运行容器测试代码读写分离分片集群mkdir -p /opt/docker/redis_study/redis_0/conf mkdir -p /opt/…

藏经阁(五)温湿度传感器 SHT3x-DIS 手册 解析

文章目录芯片特性芯片内部框图芯片引脚定义芯片温湿度范围芯片寄存器以及时序讲解信号转换公式芯片特性 湿度和温度传感器完全校准&#xff0c;线性化温度补偿数字输出供电电压范围宽&#xff0c;从2.4 V到5.5 VI2C接口通讯速度可达1MHz和两个用户可选地址典型精度 2% RH和 0.…

Python 二分查找:bisect库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

优先级队列详解

目录优先级队列简介关于堆为什么得用完全二叉树用堆来实现优先级队列插入/删除/获取优先级最高的元素模拟实现使用PriorityQueue的注意事项PriorityQueue常用接口优先级队列的构造方法优先级队列简介 PriorityQueue&#xff0c;即优先级队列。它可以保证每次出出来的数据是队列…

探究:kafka生产者/消费者与多线程安全

目录 1. 多线程安全 1.1. 生产者是多线程安全的么&#xff1f; 1.1. 消费者是多线程安全的么&#xff1f; 2. 消费者规避多线程安全方案 2.1. 每个线程维护一个kafkaConsumer 2.2. [单/多]kafkaConsumer实例 多worker线程 2.3.方案优缺点对比 1. 多线程安全 1.1. 生产…

我的Git stash不小心清空了怎么办,提了代码能反悔吗

文章目录1. 前言2. git stash清空场景2. git stash clear后如何还原3.Git撤销已经推送(push)至远端仓库的信息1. 前言 本文总结的知识很实用哈&#xff0c;虽然是git工具的不常用操作&#xff0c;但是绝对不是冷知识&#xff0c;学会可以从会用git升级到git高手。 主要是两种场…

Centos7 安装Mysql8.0

1、到指定目录下下载安装包[rootVM-0-14-centos ~]# cd /usr/local/src2、下载mysql8[rootVM-0-14-centos src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz3、解压mysql8, 通过xz命令解压出tar包&#xff0c; 然后通过t…