Pyqt5实现Widget内部拖拽

​ 在本次项目的beta迭代中,程序需要在需要在QListWidget内实现对于添加后的测试序列,可以通过鼠标拖拽的方式来移动测试序列,方便用户操作。

允许拖拽

​ 如果是单纯需要移动Widget内的拖拽操作,只需要设置一下Widget内的拖拽方法:

class AddTest(QtWidgets.QDialog,Ui_Add_test):

    def __init__(self):

        QtWidgets.QDialog.__init__(self)
Ui_Add_test.__init__(self)
self.setupUi(self)
self.setFixedSize(self.width(),self.height())
self.currentQueueList.setDragDropMode(self.currentQueueList.InternalMove)

​ 最后一行代码 self.currentQueueList.setDragDropMode(self.currentQueueList.InternalMove)就设置了currentQueueList内部的拖拽模式,其中参数可以是QListWidget的以下成员常量(在c++版本Qt中是enum常量,但是python没有常量,以整形存在):

  • NoDragDrop,不允许拖拽

  • DragOnly,只允许拖出

  • DropOnly只允许拽进

  • DragDrop允许拖出和拽进

  • InternalMove允许内部拖拽

    拖拽模式设置好以后就可以在QListWidget内部拖拽从而改变其内部的item的顺序了。

拖拽同时执行操作

​ 实现内部拖拽之后,item的顺序改变仅仅是客户端界面的顺序改变,实际进行测试操作的MonkeyRunner操作部分(可以理解为本软件的后端)仍需要客户端发送同时发送信息,改变后端的测试队列顺序。

​ 在Pyqt5中,或者说在qt中,操作和函数对应着信号(signal)和(slot),操作发送信号到对应的槽,执行槽内对应函数。而拖拽操作从开始到结束的过程中对应着好几个槽事件,这些事件函数在QListWidget已经写好,但是可以通过继承并重写的形式来更改内容:

  • dropEvent拖拽结束以后触发的事件

  • dragMoveEvent拖拽移动过程中触发的事件

  • dragEnterEvent(从外部或内部控件)拖拽进入后触发的事件

  • dragLeaveEvent拖拽离开当前容器控件后触发的事件

本软件需要做到拖拽结束后触发顺序改变的事件,所以选择继承QListWidget类重写dropEvent方法

# overload.py #
class MyCurrentQueue(QtWidgets.QListWidget):
def __init__(self,parent = None):
super(MyCurrentQueue,self).__init__(parent)
def dropEvent(self,event):
print('%d '%self.currentRow(),end = '')#用于打印拖拽前后目标item的索引值,以便观察
index1 = self.currentRow()
super(MyCurrentQueue,self).dropEvent(event)#如果不调用父类的构造方法,拖拽操作将无法正常进行
index2 = self.currentRow()
Monkey.change(index1+ 1, index2 + 1)#调用后端提供的change方法
print(self.currentRow())

由于界面代码是由qt designer生成的,将生成的代码中的

self.currentQueueList = QtWidget.QListWidget(self.groupBox)

改成

self.currentQueueList = overload.MyCurrentQueue(self.groupBox)

重新执行程序,拖拽的同时就会打印拖拽前后的拖拽目标在容器中的索引值,并调用函数改变后端队列的顺序。

如图所示。

[技术博客]Pyqt5实现Widget内部拖拽的更多相关文章

  1. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  2. [福大软工] Z班——个人技术博客评分

    个人技术博客 作业地址 https://edu.cnblogs.com/campus/fzu/SoftwareEngineering2015/homework/1070 作业要求 个人技术博客单次作业 ...

  3. 50家硅谷IT公司技术博客

    分享一下 50 家硅谷优秀 IT 公司技术博客,从中可以了解企业文化,技术特色和设计语言,如果直接列出来很单调,加上点评,算吐槽版吧. 知名大厂   1. Facebook https://www.f ...

  4. 在Ubuntu14.04上安装WordPress4搭建技术博客

    1.安装LAMP环境 1.1 安装Apache2 1.2 安装MySQL5 1.3 安装PHP5 1.4 安装phpMyAdmin 2.初始化数据库 3.下载并配置WordPress 4.配置Apac ...

  5. 【技术博客】基于JsPlumb和JQuery-UI的流程图的保存和再生成

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. 基于JsPlumb和JQuery-UI的流程图的保存和再生 ...

  6. 【技术博客】Pytorch代码生成

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Pytorch代码生成经验文档 关于模型代码的生成,主要思 ...

  7. [技术博客]Android 开发 Bug Log

    [技术博客] Android 开发 Bug Log 大大小小的bug,聪明的愚蠢的都有, 持续记录中...... java.lang.IllegalArgumentException: The sty ...

  8. [技术博客]采用Bootstrap框架进行排版布局

    [技术博客]采用Bootstrap框架进行排版布局 网页的前端框架有很多很多种,比如Bootstrap.Vue.Angular等等,在最开始其实并没有考虑到框架这回事,开始阅读往届代码时发现其部分采用 ...

  9. [技术博客] BeautifulSoup4分析网页

    [技术博客] BeautifulSoup4分析网页 使用BeautifulSoup4进行网页文本分析 前言 进行网络爬虫时我们需要从网页源代码中提取自己所需要的信息,分析整理后存入数据库中. 在pyt ...

随机推荐

  1. pandas-22 数据去重处理

    pandas-22 数据去重处理 数据去重可以使用duplicated()和drop_duplicates()两个方法. DataFrame.duplicated(subset = None,keep ...

  2. Java 之 线程池

    一.线程池思想概述 如果使用线程的时候就去创建一个线程,这样实现起来非常简便,但是会出现一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 ...

  3. Java 之 自定义异常

    1.为什么需要自定义异常类 Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是没有定义好的,此时我们根据自己业务的异常情况来定义异常类.  一些异常都是 Java ...

  4. Android编译系统中的Android.bp

    https://www.cnblogs.com/bluestorm/p/10895005.html Android.bp,是用来替换Android.mk的配置文件. 它使用Blueprint框架来解析 ...

  5. 【Python】生成器

    生成器是一种特殊的迭代器 # 斐波那契数列 10 def create_num(all_num): a, b = 0, 1 current_num = 0 while current_num < ...

  6. linux系统IO操作

    本文重点说明下面内容: 什么是标准IO,什么是文件IO? 什么是Direct IO? O_SYNC标识有什么意义? 各个层面的缓存如何同步? 还在page cache中的脏页可以读写吗? IO路径上的 ...

  7. phpstorm webstorm编辑器正则替换 类名,方法名替换

    首先勾选Match Case 和 Regex 正则规则:无须添加//左右分解符,直接写正则表达式,注意应该转义的部分,需要原封不动替换的部分加上括号 替换规则:正常书写正则,要继承下来的字符使用$1. ...

  8. nginx重试机制proxy_next_upstream

    nginx作为反向代理服务器,后端RS有多台服务器,上层通过一定机制保证容错和负载均衡. nginx的重试机制就是容错的一种 官方链接:http://nginx.org/en/docs/http/ng ...

  9. 性能测试基础---LR关联

    ·什么时候需要做关联?一般来说,在脚本运行出错的时候,我们就可能需要进行关联处理. ·脚本出错分为两种情况: ·直接回放出错(失败).通常来说,如果录制成功,回放失败,排除数据的唯一性约束之后,那就必 ...

  10. rootkit——一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,一般都和木马、后门等其他恶意程序结合使用

    Rootkit是指其主要功能为隐藏其他程式进程的软件,可能是一个或一个以上的软件组合:广义而言,Rootkit也可视为一项技术.   目录 1 rootkit是什么 2 rootkit的功能 root ...