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按钮拖拽,实现拖拽新增和拖拽移动相关推荐

  1. vue 悬浮按钮_Vue@哇!几行代码实现拖拽视图组件

    概述 最近开发的项目中有一个分享的悬浮按钮,这个按钮遮挡了页面信息,产品经理跑过来问我,是否可以把这个按钮做成可以拖拽的,研究了一下轻松实现了这个功能,这里分享给大家.这个项目是基于vue的公众号网页 ...

  2. JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

    原文:JS组件系列--Bootstrap Table 表格行拖拽(二:多行拖拽) 前言:前天刚写了篇JS组件系列--Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的 ...

  3. Element UI表格拖拽(vue中) —— 行拖拽、列拖拽

    目录 安装依赖 vuedraggable 实现拖拽的要点 行拖拽要点 列拖拽要点 完整范例代码 安装依赖 vuedraggable 安装  vuedraggable 的同时,会自动安装 sortabl ...

  4. vue项目中 五小一大六宫格拖拽排序,6宫格拖拽换位,矩阵拖拽排序

    背景:项目中用到1.4.6.9.12.16宫格排序,拖拽换位等场景,项目是监控的视频矩阵,用户矩阵拖拽排序换位,之前已经实现1.4.9.12.16等矩阵式排列的拖拽排序,但是六宫格要求五小一大,之前的 ...

  5. 云鲸扫拖一体机器人说明书_云鲸拖扫一体机器人体验:自动清洗拖布,解放你的双手...

    原标题:云鲸拖扫一体机器人体验:自动清洗拖布,解放你的双手 对于家庭主妇来说,扫地是每天必不可扫的动作.男士也概莫能外,古人早有定论,一屋不扫何以扫天下.在如何对待扫地这个问题上,相信没有人可以轻松搞 ...

  6. PyQt5 按钮QSS美化集

    PyQt5 按钮QSS美化集 盒子模型 每个控件矩形都由元素的内容(content).内边距(padding).边框(border)和外边距(margin)组成. 1.美化-1 [效果] QSS代码 ...

  7. 扫拖地机器人预留_米家扫拖机器人评测:能扫能拖,一次性搞定

    现如今,年轻人的生活压力越来越大,在经历了一天的繁忙工作之后,已经没有多余的精力应对家务劳动.特别是扫地这类看似简单却费时费力的家务活,令人十分烦恼,于是很多消费者都选择扫地机器人以改善这一问题.然而 ...

  8. HTML5新增的拖拽属性draggable,怎么实现拖拽?

    draggable定义和用法: 1.draggable 属性规定元素是否可拖动. 2.提示: 链接和图像默认是可拖动的. 3.提示: draggable 属性经常用于拖放操作. 注意:draggabl ...

  9. swift 拖动按钮_Swift下使用UICollectionView 实现长按拖拽功能

    导读 简单用Swift写了一个collectionview的拖拽点击排序效果; 拖拽排序是新闻类的App可以说是必有的交互设计,如今日头条,网易新闻等. 效果 主要代码 手势长按移动 1.给Colle ...

最新文章

  1. 错误信息输出,重定向到文件
  2. http://blog.sina.com.cn/s/blog_7b9d64af0101cjci.html
  3. 走向.NET架构设计—第三章—分层设计,初涉架构
  4. Android NDK开发method GetStringUTFChars’could not be resolved
  5. silverlight storyboard
  6. 210228Linux 条件变量 线程池
  7. C++爬虫项目爬取图片
  8. windows传真和扫描由于不能访问您的文档_扫描识别工具Dynamic Web TWAIN全年最低价来了!错过再等一年...
  9. 利用百度地图API,在浏览器中找到自己的位置
  10. android中搭建NDK环境及使用JNI技术
  11. java版spring cloud+spring boot+redis多租户社交电子商务平 (三)SpringBoot用JdbcTemplates访问Mysql...
  12. 几个阿里,美团,腾讯大佬的公众号!超级变态!
  13. 游戏开发完整学习路线,都在这里了
  14. R语言聚类分析(系统聚类、K-均值聚类)
  15. matplotlib出图细节以及提高出图质量(高dpi)
  16. MATLAB实现的车牌定位系统
  17. Python | pandas 计算每行的增长率与累计增长率
  18. CTGU实验5_1-创建还书过程中的触发器
  19. Python安全工具编写-pcap流量包重放
  20. mysql auto_increment 原理_mysql原理之Auto_increment

热门文章

  1. java数据集导出excel_使用Apache Poi将结果集从Java数据库导出到Excel
  2. 一切从游戏开始-完整的一个python to hack 实例
  3. 魅族android不兼容Android,魅族17系列彻底跟上时代,搭载基于Android 10的Flyme 8.1系统...
  4. 优秀课程案例:使用Scratch图形化编程工具模拟物理机械运动-连杆
  5. 摄像头拍摄视频,保存视频,并将视频保存为图片
  6. 单工通信模式、半双工通信模式和全双工通信模式的区别
  7. Try-with-resources are not supported at language level ‘5‘ 报错
  8. 拓嘉辰丰:拼多多活动结束,怎样避免流量大跌尴尬期
  9. DDR Layout使用技巧
  10. 利用pcs+pacemaker+corosync实现(HA)高可用集群