在本次项目的beta迭代中,程序须要在须要在QListWidget
内实现对于添加后的测试序列,能够经过鼠标拖拽的方式来移动测试序列,方便用户操做。python
若是是单纯须要移动Widget内的拖拽操做,只须要设置一下Widget内的拖拽方法:c++
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
只容许拽进code
DragDrop
容许拖出和拽进blog
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)
从新执行程序,拖拽的同时就会打印拖拽先后的拖拽目标在容器中的索引值,并调用函数改变后端队列的顺序。
如图所示。