pyqt5按钮拖拽,实现拖拽新增和拖拽移动
pyqt5按钮拖拽,实现拖拽新增和拖拽移动
按钮默认不能拖动,需要重新按钮类,我们的需求是按钮拖动复制和单纯的拖动,所以需要重写两个类
按钮拖动复制
class MyPushButton(QPushButton):def __init__(self, parent=None, text=''):super(MyPushButton, self).__init__(parent)self.text = textself.setText(text)def mouseMoveEvent(self, e):if e.buttons() != Qt.LeftButton:returnmimeData = QMimeData()mimeData.setText('add,' + self.text)drag = QDrag(self)drag.setMimeData(mimeData)drag.exec_(Qt.MoveAction)self.setAcceptDrops(False)
QMimeData类可以设置很多数据,我们只需要使用setText即可,在我们重写的鼠标移动事件中,鼠标移动的时候将携带QMimeData对象。
按钮拖动移动
class MyPushButton2(QPushButton):def __init__(self, parent=None, text=''):super(MyPushButton2, self).__init__(parent)self.text = textself.setText(text)def mouseMoveEvent(self, e):if e.buttons() != Qt.LeftButton:returnmimeData = QMimeData()mimeData.setText('move,' + self.text)drag = QDrag(self)drag.setMimeData(mimeData)drag.setHotSpot(e.pos() - self.rect().topLeft())drag.exec_(Qt.MoveAction)self.setAcceptDrops(False)
按钮2只是传递的字符信息不同了,这样可以方便我们进行后续处理
按钮可以拖动了(实际上是鼠标携带按钮信息),不代表我们已经可以放置按钮,QGroupBox默认不接受放置,所以我们又需要重新一个类
class MyGroupBox(QGroupBox):AddSignal = pyqtSignal(list)MoveSignal = pyqtSignal(list)def __init__(self, parent=None):super(MyGroupBox, self).__init__(parent)self.setAcceptDrops(True)def dragEnterEvent(self, e):# print(e)if e.mimeData().hasText():e.accept()else:e.ignore()def dropEvent(self, e):data = e.mimeData().text().split(',')# print((e.pos().x(), e.pos().y()))if data[0] == 'add':self.AddSignal.emit([data[1], e.pos()])elif data[0] == 'move':self.MoveSignal.emit([data[1], e.pos()])
这次我们重写了两个方法,dragEnterEvent表示拖动移入事件,dropEvent表示放置事件,setAcceptDrops用来设置我们的类是否接收放置事件,默认是False。我们通过判断字符信息将按钮数据通过不同的信号发送给主窗口,主窗口再通过绑定不同函数执行相应的操作。
完整代码:
import sys
from PyQt5.QtCore import pyqtSignal, QMimeData, Qt
from PyQt5.QtGui import QDrag
from PyQt5.QtWidgets import QApplication, QGridLayout, QGroupBox, QWidget, QPushButtonclass MyPushButton(QPushButton):def __init__(self, parent=None, text=''):super(MyPushButton, self).__init__(parent)self.text = textself.setText(text)def mouseMoveEvent(self, e):if e.buttons() != Qt.LeftButton:returnmimeData = QMimeData()mimeData.setText('add,' + self.text)drag = QDrag(self)drag.setMimeData(mimeData)drag.exec_(Qt.MoveAction)self.setAcceptDrops(False)class MyPushButton2(QPushButton):def __init__(self, parent=None, text=''):super(MyPushButton2, self).__init__(parent)self.text = textself.setText(text)def mouseMoveEvent(self, e):if e.buttons() != Qt.LeftButton:returnmimeData = QMimeData()mimeData.setText('move,' + self.text)drag = QDrag(self)drag.setMimeData(mimeData)drag.setHotSpot(e.pos() - self.rect().topLeft())drag.exec_(Qt.MoveAction)self.setAcceptDrops(False)class MyGroupBox(QGroupBox):AddSignal = pyqtSignal(list)MoveSignal = pyqtSignal(list)def __init__(self, parent=None):super(MyGroupBox, self).__init__(parent)self.setAcceptDrops(True)def dragEnterEvent(self, e):# print(e)if e.mimeData().hasText():e.accept()else:e.ignore()def dropEvent(self, e):data = e.mimeData().text().split(',')# print((e.pos().x(), e.pos().y()))if data[0] == 'add':self.AddSignal.emit([data[1], e.pos()])elif data[0] == 'move':self.MoveSignal.emit([data[1], e.pos()])class DragDemoView(QWidget):def __init__(self):super(DragDemoView, self).__init__()self.setUI()self.show()def setUI(self):self.setWindowTitle("DragDemoView")self.resize(QApplication.desktop().availableGeometry().width() - 400,QApplication.desktop().availableGeometry().height() - 200)self.drawBox = MyGroupBox(self)self.drawBox.AddSignal.connect(self.add_button)self.drawBox.MoveSignal.connect(self.move_button)self.toolBox = QGroupBox(self)self.button1 = MyPushButton(self.toolBox, 'test')self.buttonDict = {}self.layout = QGridLayout(self)self.layout.addWidget(self.toolBox, 0, 0, 1, 1)self.layout.addWidget(self.drawBox, 0, 1, 1, 1)def add_button(self, data):n = 0buttonName = data[0] + str(n)while buttonName in self.buttonDict:n += 1buttonName = data[0] + str(n)button = MyPushButton2(self.drawBox, buttonName)self.buttonDict[buttonName] = buttonbutton.move(data[1])button.show()def move_button(self, data):button = self.buttonDict[data[0]]button.move(data[1])button.show()if __name__ == '__main__':app = QApplication(sys.argv)main = DragDemoView()app.exit(app.exec_())
主窗口决定了按钮的复制和移动,实际上就是通过按钮所传递的信息进行的操作,所有按钮信息必须唯一(上面的程序是通过判断按钮上的文字)。
如有疑问,可以评论联系我,谢谢。
pyqt5按钮拖拽,实现拖拽新增和拖拽移动相关推荐
- vue 悬浮按钮_Vue@哇!几行代码实现拖拽视图组件
概述 最近开发的项目中有一个分享的悬浮按钮,这个按钮遮挡了页面信息,产品经理跑过来问我,是否可以把这个按钮做成可以拖拽的,研究了一下轻松实现了这个功能,这里分享给大家.这个项目是基于vue的公众号网页 ...
- JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)
原文:JS组件系列--Bootstrap Table 表格行拖拽(二:多行拖拽) 前言:前天刚写了篇JS组件系列--Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的 ...
- Element UI表格拖拽(vue中) —— 行拖拽、列拖拽
目录 安装依赖 vuedraggable 实现拖拽的要点 行拖拽要点 列拖拽要点 完整范例代码 安装依赖 vuedraggable 安装 vuedraggable 的同时,会自动安装 sortabl ...
- vue项目中 五小一大六宫格拖拽排序,6宫格拖拽换位,矩阵拖拽排序
背景:项目中用到1.4.6.9.12.16宫格排序,拖拽换位等场景,项目是监控的视频矩阵,用户矩阵拖拽排序换位,之前已经实现1.4.9.12.16等矩阵式排列的拖拽排序,但是六宫格要求五小一大,之前的 ...
- 云鲸扫拖一体机器人说明书_云鲸拖扫一体机器人体验:自动清洗拖布,解放你的双手...
原标题:云鲸拖扫一体机器人体验:自动清洗拖布,解放你的双手 对于家庭主妇来说,扫地是每天必不可扫的动作.男士也概莫能外,古人早有定论,一屋不扫何以扫天下.在如何对待扫地这个问题上,相信没有人可以轻松搞 ...
- PyQt5 按钮QSS美化集
PyQt5 按钮QSS美化集 盒子模型 每个控件矩形都由元素的内容(content).内边距(padding).边框(border)和外边距(margin)组成. 1.美化-1 [效果] QSS代码 ...
- 扫拖地机器人预留_米家扫拖机器人评测:能扫能拖,一次性搞定
现如今,年轻人的生活压力越来越大,在经历了一天的繁忙工作之后,已经没有多余的精力应对家务劳动.特别是扫地这类看似简单却费时费力的家务活,令人十分烦恼,于是很多消费者都选择扫地机器人以改善这一问题.然而 ...
- HTML5新增的拖拽属性draggable,怎么实现拖拽?
draggable定义和用法: 1.draggable 属性规定元素是否可拖动. 2.提示: 链接和图像默认是可拖动的. 3.提示: draggable 属性经常用于拖放操作. 注意:draggabl ...
- swift 拖动按钮_Swift下使用UICollectionView 实现长按拖拽功能
导读 简单用Swift写了一个collectionview的拖拽点击排序效果; 拖拽排序是新闻类的App可以说是必有的交互设计,如今日头条,网易新闻等. 效果 主要代码 手势长按移动 1.给Colle ...
最新文章
- 错误信息输出,重定向到文件
- http://blog.sina.com.cn/s/blog_7b9d64af0101cjci.html
- 走向.NET架构设计—第三章—分层设计,初涉架构
- Android NDK开发method GetStringUTFChars’could not be resolved
- silverlight storyboard
- 210228Linux 条件变量 线程池
- C++爬虫项目爬取图片
- windows传真和扫描由于不能访问您的文档_扫描识别工具Dynamic Web TWAIN全年最低价来了!错过再等一年...
- 利用百度地图API,在浏览器中找到自己的位置
- android中搭建NDK环境及使用JNI技术
- java版spring cloud+spring boot+redis多租户社交电子商务平 (三)SpringBoot用JdbcTemplates访问Mysql...
- 几个阿里,美团,腾讯大佬的公众号!超级变态!
- 游戏开发完整学习路线,都在这里了
- R语言聚类分析(系统聚类、K-均值聚类)
- matplotlib出图细节以及提高出图质量(高dpi)
- MATLAB实现的车牌定位系统
- Python | pandas 计算每行的增长率与累计增长率
- CTGU实验5_1-创建还书过程中的触发器
- Python安全工具编写-pcap流量包重放
- mysql auto_increment 原理_mysql原理之Auto_increment
热门文章
- java数据集导出excel_使用Apache Poi将结果集从Java数据库导出到Excel
- 一切从游戏开始-完整的一个python to hack 实例
- 魅族android不兼容Android,魅族17系列彻底跟上时代,搭载基于Android 10的Flyme 8.1系统...
- 优秀课程案例:使用Scratch图形化编程工具模拟物理机械运动-连杆
- 摄像头拍摄视频,保存视频,并将视频保存为图片
- 单工通信模式、半双工通信模式和全双工通信模式的区别
- Try-with-resources are not supported at language level ‘5‘ 报错
- 拓嘉辰丰:拼多多活动结束,怎样避免流量大跌尴尬期
- DDR Layout使用技巧
- 利用pcs+pacemaker+corosync实现(HA)高可用集群