在本次項目的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)
從新執行程序,拖拽的同時就會打印拖拽先後的拖拽目標在容器中的索引值,並調用函數改變後端隊列的順序。
如圖所示。