[技術博客]Pyqt5實現Widget內部拖拽

Pyqt5實現Widget內部拖拽

​ 在本次項目的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)

從新執行程序,拖拽的同時就會打印拖拽先後的拖拽目標在容器中的索引值,並調用函數改變後端隊列的順序。

如圖所示。

相關文章
相關標籤/搜索