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_())

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

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

相关文章

煮粽子(zongzi)

煮粽子 题目描述 端午节快到了&#xff0c;小红作为一名吃货&#xff0c;非常喜欢吃粽子&#xff0c;因此对端午节也是很期待的。 小红前往超市买了 n n n袋粽子&#xff0c;每袋粽子有 x x x颗。小红每次煮 k k k颗粽子&#xff0c;请你计算小红一共可以煮多少次&#xff0…

MicroPython教程:ESP8266 快速参考

ESP8266 快速参考 Adafruit Feather HUZZAH 板&#xff08;图片来源&#xff1a;Adafruit&#xff09;。 以下是基于 ESP8266 的开发板的快速参考。如果这是您第一次使用该板&#xff0c;请考虑先阅读以下部分&#xff1a; 关于 ESP8266 端口的一般信息ESP8266 的 MicroPytho…

持续总结中!2024年面试必问 20 道分布式、微服务面试题(一)

一、什么是分布式系统&#xff1f; 分布式系统是由多个计算机组成的系统&#xff0c;这些计算机通过网络连接在一起&#xff0c;协同工作以完成一个共同的目标或任务。以下是分布式系统的一些关键特点和概念&#xff1a; 网络连接&#xff1a;分布式系统中的计算机通常分布在不…

洛谷 P1253 扶苏的问题 题解 线段树

扶苏的问题 题目描述 给定一个长度为 n n n 的序列 a a a&#xff0c;要求支持如下三个操作&#xff1a; 给定区间 [ l , r ] [l, r] [l,r]&#xff0c;将区间内每个数都修改为 x x x。给定区间 [ l , r ] [l, r] [l,r]&#xff0c;将区间内每个数都加上 x x x。给定区…

每日一题:聊聊 Redis 过期键的删除策略

聊聊 Redis 过期键的删除策略 答案 惰性删除 &#xff1a;只会在取出 key 的时候才对数据进行过期检查&#xff1b;这样对 CPU 最友好&#xff0c;但是可能会造成太多过期 key 没有被删除&#xff08;占用内存&#xff09;。 通过定时器实现&#xff08;时间事件&#xff09;&…

No module named _sqlite3解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【经典案例】使用HAL库配置STM32F407的SPI外设

使用HAL库配置STM32F407的SPI外设 在嵌入式系统开发中&#xff0c;STM32F407是一款广泛应用的微控制器&#xff0c;而SPI&#xff08;Serial Peripheral Interface&#xff09;是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层&#xff08;HAL&#xff09;库配…

Web前端三大主流框架:React、Angular和Vue的比较与选择

Web前端三大主流框架&#xff1a;React、Angular和Vue的比较与选择 Web前端技术的快速发展为开发者提供了丰富的工具和框架&#xff0c;其中React、Angular和Vue是当前最受欢迎的三大框架。这三个框架各有特点&#xff0c;适用于不同的项目需求和开发团队。本文将对React、Ang…

【红黑树变色+旋转】

文章目录 一. 红黑树规则二. 情况一叔叔存在且为红情况二.变色旋旋 一. 红黑树规则 对于红黑树&#xff0c;进行变色旋转处理&#xff0c;终究都是为了维持颜色以下几条规则&#xff0c;只有颜色和规则维持住了&#xff0c;红黑树就维持住了最长路径的长度不超过最短路径的两倍…

环 境 变 量

如果希望某一个文件在 CMD 窗口的任意路径下都可以打开&#xff0c;则需要将该文件的路径存放在环境变量中。 在 CMD 中运行该文件时&#xff0c;优先查看当前路径下的文件&#xff0c;如果没有找到&#xff0c;则进入环境变量中记录的路径下寻找该文件&#xff0c;如果能找到…

【微信小程序】处理蓝牙数据相关函数

1、将十六进制数组转换为 ArrayBuffer function getBuffer(hexArr) {let buffer new ArrayBuffer(hexArr.length)let dataView new DataView(buffer);hexArr.forEach((item, index) > {dataView.setUint8(index, item);})return buffer }创建了一个与输入数组长度相同的新…

人工智能安全风险分析及应对策略

文│中国移动通信集团有限公司信息安全管理与运行中心 张峰 江为强 邱勤 郭中元 王光涛 人工智能&#xff08;AI&#xff09;是引领新一轮科技革命和产业变革的关键技术。人工智能赋能网络安全的同时&#xff0c;也会带来前所未有的安全风险。本文在介绍人工智能技术赋能网络安…

Docker高级篇之Docker搭建mysql主从复制架构

文章目录 1. 安装mysql主从复制2. 主从复制测试 1. 安装mysql主从复制 首先创建主节点 docker run -d -p 3308:3306 \ --privilegedtrue \ -v /Users/jackchai/Desktop/lottory_docker/learndocker/mymysql/master/log:/var/log/mysql \ -v /Users/jackchai/Desktop/lottory_…

端午假期来临,来使用闪侠惠递便宜寄快递吧!

相信很多人和我一样&#xff0c;每当需要寄快递时&#xff0c;总是感到十分头疼。不同的快递公司有不同的价格、时效和服务质量等等&#xff0c;选择起来真的很不容易。但是现在有了闪侠惠递来帮大家寄快递吧&#xff0c;这个问题就可以迎刃而解了&#xff01;小编奉劝大家快来…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 20 - 21节&#xff09; P20《19.ArkUI-属性动画和显式动画》 本节先来学习属性动画和显式动画&#xff1a; 在代码中定义动画&am…

【学习笔记】Linux前置准备

视频学习资料 基础&#xff1a; 黑马0基础&#xff08;前面四章即可&#xff0c;包含软件基础安装配置&#xff09; 进阶&#xff1a; 黑马程序员-Linux系统编程 黑马程序员-Linux网络编程 我也还没看&#xff0c;看了眼目录感觉把八股里面很多场景都讲到了&#xff0c;感觉有…

mysql自带分页

select 查询列表 from 表 limit offset,pagesize; offset代表的是起始的条目索引&#xff0c;默认从0开始size代表的是显示的条目数offset(n-1)*pagesize -- 第-页 limit 0 5 -- 第二页 limit 5,5 -- 第三页 limit 10,5 -- 第n页limit(n-1)*pagesize,pagesize -- pages…

在keil5中打开keil4工程的方法

文章目录 1. 打开文件 2. 安装旧版本包 3. 在keil4中打开keil5工程 1. 打开文件 在keil5 MDK的环境下&#xff0c;打开keil4的工程文件&#xff0c;会弹出下图所示的窗口&#xff1a; 参考官网的解释这两个方法分别为&#xff1a; 1. 使用MDK 版本 4 Legacy Pack时&#x…

Android 高德地图API(新版)

新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…

electron打包时资源下载失败cannot resolve xxx/30.0.9/electron-v30.0.9-win32-ia32.zip

同学们可以私信我加入学习群&#xff01; 正文开始 问题描述解决方案总结 问题描述 最近electron更新频繁&#xff0c;而我在用electron做个人项目&#xff0c;对稳定性没有太高要求&#xff0c;希望保持着electron的最新版本&#xff0c;所以就没有固定版本。 单位网络不太好…