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

pyqt5 tablewidget实现excel拖曳填充

 代码主要涉及鼠标事件和绘图,selectionModel,selectedIndexes。

import sys
from PyQt5.QtCore import QPoint, Qt, QCoreApplication, pyqtSlot
from PyQt5.QtGui import  QBrush, QPixmap, QColor, QPainter,QIcon,QPolygon
from PyQt5.QtWidgets import (QAction, QColorDialog, QComboBox, QDialog, QFontDialog,QGroupBox, QHBoxLayout, QMainWindow, QLabel,QLineEdit, QMessageBox, QPushButton, QToolBar,QTableWidgetItem, QTableWidget, QVBoxLayout, QWidget)
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtWidgets
import logging
class MyTableWidget(QTableWidget):dragbottom = pyqtSignal(object)def __init__(self,parent):super().__init__(parent)self.cellBottomRight=Falseself.leftbuttonDown=Falsedef paintEvent(self,e):super().paintEvent(e)painter=QPainter(self.viewport())# painter.save();pen = painter.pen();pen.setWidth(1);selections = self.selectionModel()if selections!=None:# logging.info("not None")list1 = selections.selectedIndexes()for i in range(len(list1)):modelIndex = list1[i]#QRect类提供各种矩形坐标,绘制线跟点的时候需要用到坐标rect = self.visualRect(modelIndex);tmpRect=QtCore.QRect(QtCore.QPoint(rect.x()+1,rect.y()+1),QtCore.QSize(rect.width()-2,rect.height()-2))#如果是选中状态 并且在选择公式状态# if (self.item(i,j).isSelected()):#给选中单元格进行画线画点dashes=[]penXu = painter.pen();#设置画笔宽度penXu.setWidth(2);color=QColor();#设置画笔颜色color.setRgb(31,187,125);penXu.setColor(color);painter.setPen(penXu);#绘制单元格四周的线painter.drawRect(tmpRect);#绘制单元格右下角点penXu.setWidth(6);painter.setPen(penXu);painter.drawPoint(tmpRect.x()+tmpRect.width() -3,tmpRect.y()+tmpRect.height()-3);#恢复QPainter对象# painter.restore();# self.viewport().update();#鼠标移动事件def mouseMoveEvent(self,event):#获取鼠标位置信息if not self.cellBottomRight:mousePos =event.pos();#获取所有选中单元格# logging.info(self.cellBottomRight)itemList = self.selectedItems();#没有选中单元格 就退出if len(itemList) <= 0:return;modelIndex = self.indexFromItem(itemList[len(itemList)-1]);#获取最后一个选中的单元格的QRect,用来判断是否鼠标位置是否在右下角区域rect = self.visualRect(modelIndex);# logging.info([mousePos,rect])#判断是否在我们规定的区域,或者是按下模式,isClick是按下模式标志# print(dir(mousePos))if((mousePos.x() >= (rect.x()+rect.width() -7) and mousePos.x() <= (rect.x()+rect.width())and mousePos.y() >= (rect.y()+rect.height()-7) and mousePos.y() <= (rect.y()+rect.height()))):# logging.info("right bottom")#设置鼠标在右下角区域样式self.setCursor(Qt.CrossCursor);#在右下角区域self.cellBottomRight = True;super().mouseMoveEvent(event);#鼠标点击事件def mousePressEvent(self,event):if(event.button()==Qt.LeftButton):self.leftbuttonDown = True;self.setCursor(Qt.SizeAllCursor);else:self.leftbuttonDown = False;self.setCursor(Qt.ArrowCursor);super().mousePressEvent(event);#提交鼠标给控件def mouseReleaseEvent(self,ev):if self.leftbuttonDown and self.cellBottomRight:itemList = self.selectedItems();if len(itemList)>0:logging.info("dragbottom")self.dragbottom.emit(itemList)self.leftbuttonDown = False;self.cellBottomRight = False;self.setCursor(Qt.ArrowCursor);super().mouseReleaseEvent(ev)
class Table(QWidget):def __init__(self):super().__init__()self.setGeometry(300, 300, 500, 400)self.setWindowTitle('QTableWidget的基本用法')layout = QHBoxLayout()self.table = MyTableWidget(None)self.table.dragbottom.connect(self.dragbottom_trig)m=4n=3self.table.setRowCount(4)self.table.setColumnCount(3)layout.addWidget(self.table)self.table.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])for i in range(m):for j in range(n):item1 = QTableWidgetItem('')self.table.setItem(i,j,item1)item1 = QTableWidgetItem('张三')self.table.setItem(0,0,item1)item2 = QTableWidgetItem('男')self.table.setItem(0, 1, item2)item3 = QTableWidgetItem('50')self.table.setItem(0, 2, item3)self.setLayout(layout)def dragbottom_trig(self,items):print(items)  first=items[0]col=first.column()row=first.row()print(dir(first))v=first.text()for one in items[1:]:self.table.setItem(one.row(),one.column(),QTableWidgetItem(v))
if __name__ == "__main__":app = QApplication(sys.argv)form = Table()form.show()sys.exit(app.exec_())

相关文章:

  • 关于科技的总结与思考
  • swaggerHole:针对swaggerHub的公共API安全扫描工具
  • 【OPENMV】学习记录 (持续更新)
  • Go 实现的小型web server,可以通过调用api来控制和消耗 CPU 占比。通常用于测试系统负载和性能。
  • 电商API在维护数据安全与合规性中的重要性
  • 【Linux】Centos7升级内核的方法:yum更新(ELRepo)
  • 一键生成迷宫-Word插件-大珩助手新功能
  • RabbitMQ简单使用方法,以异步处理日志为例:
  • 西门子PLC学习之数据块的单个实例,多重实例与参数实例间的区别
  • codeforces round 949 div2
  • 【Linux】进程2——管理概念,进程概念
  • c++调用动态库LNK2019无法解析的外部符号LNK1120无法解析的外部命令
  • 【C++】植物大战僵尸杂交版自动存档——防闪退存档消失
  • 【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
  • 常见的api:Runtime Object
  • [译]如何构建服务器端web组件,为何要构建?
  • Android 架构优化~MVP 架构改造
  • C++类的相互关联
  • Create React App 使用
  • express.js的介绍及使用
  • httpie使用详解
  • HTTP中的ETag在移动客户端的应用
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python爬虫--- 1.3 BS4库的解析器
  • redis学习笔记(三):列表、集合、有序集合
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Cloud中负载均衡器概览
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 如何胜任知名企业的商业数据分析师?
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 线上 python http server profile 实践
  • 移动端解决方案学习记录
  • 译有关态射的一切
  • 从如何停掉 Promise 链说起
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • (3)STL算法之搜索
  • (LeetCode 49)Anagrams
  • (二)JAVA使用POI操作excel
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (汇总)os模块以及shutil模块对文件的操作
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .naturalWidth 和naturalHeight属性,
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Core 中间件与过滤器
  • .Net OpenCVSharp生成灰度图和二值图
  • .net wcf memory gates checking failed
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题