最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python PyQt5實現拖放效果的原理詳解

 更新時間:2022年11月29日 14:21:17   作者:smart_cat  
這篇文章主要為大家詳細介紹了Python PyQt5中拖放效果的實現原理與實現代碼,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

PyQt5的拖放

拖放涉及到的主要的一些類如下所示:

一、拖放的基本原理

1.1 拖放的動作

拖放操作包括兩個動作:

  • 拖動(drag)
  • 放下(drop 或稱為放置)。

當被拖動時拖動的數據會被存儲為 MIME 類型的對象, MIME 類型使用 QMimeData 類來描述。 MIME 類型通常由剪貼板和拖放系統(tǒng)使用,以識別不同類型的數據。

  • 拖動點(drag site):拖動的起始位置。
  • 放下點(drop site):被拖動的對象放下的位置,若部件不能接受拖動的對象, Qt 會改變光標的形狀(一個禁用形狀)來向用戶進行說明。

1.2 拖動的啟動和結束

啟動拖放:

拖放通過調用 QDrag::exec()函數而啟動,該函數是一個阻塞函數(但不會阻塞主事件循環(huán)),這意味著在拖放操作結束之前,不會返回該函數,調用 QDrag::exec()函數后, Qt 擁有對拖動對象的所有權,并會在必要時將其刪除。

結束拖放:

當用戶放下拖動或取消拖動操作時結束拖放。

1.3 拖放產生的過程和事件

啟動拖放后,會使數據被拖動,這時需要按住鼠標按鍵才能拖動需要拖動的數據,松開鼠標按鍵時意味著拖動結束。

默認情況下,部件不接受放下事件。使用 QWidget::setAcceptDrops()函數可設置部件是否接受放下事件(即,拖放完成時發(fā)送的事件)。只有在部件接受放下事件的情形下,才會產生以下事件。

QDragEnterEvent:拖動進入事件

當拖動操作進入部件時,該事件被發(fā)送到部件,忽略該事件,將會導至后續(xù)的拖放事件不能被發(fā)送。 通常在該部件上光標會在外觀上顯示為禁用的圖形。

QDragMoveEvnet:拖動移動事件

當拖動操作正在進行時,以及當具有焦點時按下鍵盤的修飾鍵(比如 Ctrl)時, 發(fā)送該事件, 要使部件能接收到該事件,則該部件必須接受 QDragEnterEvent 事件。

QDropEvent:放下事件

在完成拖放操作時發(fā)送該事件,即當用戶在部件上放下一個對象時,發(fā)送此事件。要使部件能接收到該事件,則該部件必須接受 QDragEnterEvent事件,且不能忽略 QDragMoveEvnt 事件。

QLeaveEvent:當拖放操作離開部件時發(fā)送該事件

注意:要使部件能接收到該事件,必須要使拖動先進入該部件(即產生 QDragEnterEvent 事件),然后再離開該部件,才會產生 QLeaveEvent 事件。因很少使用該事件,因此本文不做重點介紹。

上文中提到的必須接受是指必須重新實現該事件的處理函數并接受該事件,不能忽略是指在處件事理函數中不明確調用 ignore()函數忽略該事件,這意味著可以不必重新實現該事件的處理函數。

以上事件產生的順序為: QDragEnterEvent、 QDragMoveEvnet、 QDropEvent

1.4 編寫拖放程序的步驟

在需要接受放下數據的部件上調用 QWidget::setAcceptDrops()函數以使該部件能接受拖放事件。

啟動拖放: 通常在 mousePressEvent()或 mouseMoveEvent()函數中啟動拖放,記住啟動拖放就是調用 QDrag 對象的 exec()函數,因此也可以在 keyPressEvent()等函數中啟動拖放(因很少這樣做,所以本文不介紹這種情況下的拖放)。 在此步把需要拖動的數據保存在 QMimeData 對象中。

重新實現需要接受放下數據的部件的 dragEnterEvent()事件處理函數。

根據需要重新實現 dragMoveEvent 或 dropEvent()函數

1.5 簡單的拖放示例代碼

本示例程序示范了如何把數據從按鈕A拖至按鈕B:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
from PyQt5.QtCore import QMimeData, qDebug
from PyQt5 import QtGui
from PyQt5.QtGui import QDrag
import sys

???????class MyButton(QPushButton):
    def __init__(self, text:str) -> None:
        super().__init__(text)
        
    def mousePressEvent(self, e: QtGui.QMouseEvent) -> None:
        '''
        在該事件中啟動拖放
        '''
        # 將需要拖動的數據放入QMimeData對象中,該對象用于保存需要傳遞的數據
        # 數據的內容完全由程序員自行設定。通常為界面上所選擇的內容。
        my_mime_data = QMimeData()
        
        # 這是QMimeData中存儲的內容,即拖放的數據
        my_mime_data.setText(self.text())
        
        # 設置拖動的數據,該函數會獲得QMimeData的所有權
        my_drag = QDrag(self)
        my_drag.setMimeData(my_mime_data)
        
        # 啟動拖放
        my_drag.exec_()
        
    def dragEnterEvent(self, e: QtGui.QDragEnterEvent) -> None:
        '''
        處理是否接受拖動事件
        '''
        # 接受拖動進入事件
        e.accept()
        
        # 若忽略該事件,則不會再發(fā)送之后的事件,拖放至此結束,這會導致鼠標光標顯示為禁用的圖形
        # e.ignore()
        
    def dropEvent(self, e: QtGui.QDropEvent) -> None:
        '''
        處理拖動的數據(當然了,也可以不做任何處理)
        '''
        # 設置此部件的文本為拖動對象中的文本
        self.setText(e.mimeData().text())
        
        # 此事件不影響后續(xù)事件,可接受也可忽略
        # e.accept()
        # e.ignore()
        
class MyWidget(QWidget):
    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        self.__init_ui()
        
    def __init_ui(self):
        btn_a = MyButton('AAA')
        btn_b = MyButton('BBB')
        btn_a.setAcceptDrops(False)
        btn_b.setAcceptDrops(True)
        
        layout = QHBoxLayout()
        layout.addWidget(btn_a)
        layout.addWidget(btn_b)
        self.setLayout(layout)
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    my_widget = MyWidget()
    my_widget.show()
    sys.exit(app.exec_())

運行效果如下:

原始狀態(tài):

在按鈕AAA上按下鼠標左鍵不動并拖動到圖示位置,由于主窗口不接受放下事件,因此光標顯示為禁用的狀態(tài)

拖動AAA到按鈕BBB上時,會發(fā)送QDragEnterEvent事件,同時光標改變形狀,表示BBB按鈕可以接受拖動的數據,

在按鈕BBB上釋放鼠標時,此時發(fā)送QDropEvent事件,按鈕BBB的文本被修改為拖動對象中保存的數據。

至此,拖動結束。

到此這篇關于Python PyQt5實現拖放效果的原理詳解的文章就介紹到這了,更多相關Python PyQt5拖放內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • pandas 使用merge實現百倍加速的操作

    pandas 使用merge實現百倍加速的操作

    這篇文章主要介紹了pandas 使用merge實現百倍加速的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python如何代碼集體右移

    python如何代碼集體右移

    在本篇文章里小編給各位分享的是一篇關于python如何代碼集體右移的相關知識點文章,需要的朋友們可以學習下。
    2020-07-07
  • pandas創(chuàng)建DataFrame的方式小結

    pandas創(chuàng)建DataFrame的方式小結

    今天給大家整理了pandas創(chuàng)建DataFrame的方式小結,現在我們就來看看這三種生成Dataframe的方式,每種方式通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-09-09
  • python select.select模塊通信全過程解析

    python select.select模塊通信全過程解析

    這篇文章主要為大家解析了python select.select模塊通信全過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • python讀寫Excel表格的實例代碼(簡單實用)

    python讀寫Excel表格的實例代碼(簡單實用)

    這篇文章主要介紹了python讀寫Excel表格的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Python文件操作基礎及異常處理

    Python文件操作基礎及異常處理

    這篇文章主要介紹了文件操作的基本方法,包括如何打開和關閉文件、使用with語句管理文件、讀取和寫入文件內容、處理文件異常、進行二進制文件操作以及文件路徑的說明,,需要的朋友可以參考下
    2025-03-03
  • python tornado使用流生成圖片的例子

    python tornado使用流生成圖片的例子

    今天小編就為大家分享一篇python tornado使用流生成圖片的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python中關于eval函數的使用及說明

    python中關于eval函數的使用及說明

    這篇文章主要介紹了python中關于eval函數的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 對Python3 序列解包詳解

    對Python3 序列解包詳解

    今天小編就為大家分享一篇對Python3 序列解包詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • django 利用Q對象與F對象進行查詢的實現

    django 利用Q對象與F對象進行查詢的實現

    這篇文章主要介紹了django 利用Q對象與F對象進行查詢的實現,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論

西吉县| 镇平县| 江门市| 望奎县| 东方市| 新巴尔虎右旗| 电白县| 沾化县| 深水埗区| 吉木乃县| 垫江县| 白朗县| 瑞丽市| 洪泽县| 奈曼旗| 常州市| 阳曲县| 东辽县| 额济纳旗| 顺平县| 万载县| 上林县| 蓬安县| 济南市| 永定县| 济源市| 丹寨县| 龙海市| 那坡县| 宁陵县| 屯留县| 青海省| 阿合奇县| 阜康市| 关岭| 攀枝花市| 汉寿县| 黑龙江省| 伊宁县| 芦溪县| 广安市|