摘要:把一個表格從上拖放到另外一個位置的實質是操作一個圖形組。激活組件的拖拽事件。設定好接受拖拽的數據類型。默認支持拖拽操作,所以我們只要調用方法使用就行了。從繼承一個類,然后重構的兩個方法和是拖拽開始的事件。指定放下的動作類型為。
拖拽
在GUI里,拖放是指用戶點擊一個虛擬的對象,拖動,然后放置到另外一個對象上面的動作。一般情況下,需要調用很多動作和方法,創建很多變量。
拖放能讓用戶很直觀的操作很復雜的邏輯。
一般情況下,我們可以拖放兩種東西:數據和圖形界面。把一個圖像從一個應用拖放到另外一個應用上的實質是操作二進制數據。把一個表格從Firefox上拖放到另外一個位置 的實質是操作一個圖形組。
簡單的拖放本例使用了QLineEdit和QPushButton。把一個文本從編輯框里拖到按鈕上,更新按鈕上的標簽(文字)。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This is a simple drag and drop example. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import (QPushButton, QWidget, QLineEdit, QApplication) import sys class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True) def dragEnterEvent(self, e): if e.mimeData().hasFormat("text/plain"): e.accept() else: e.ignore() def dropEvent(self, e): self.setText(e.mimeData().text()) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): edit = QLineEdit("", self) edit.setDragEnabled(True) edit.move(30, 65) button = Button("Button", self) button.move(190, 65) self.setWindowTitle("Simple drag and drop") self.setGeometry(300, 300, 300, 150) if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() ex.show() app.exec_()
class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True)
為了完成預定目標,我們要重構一些方法。首先用QPushButton上構造一個按鈕實例。
self.setAcceptDrops(True)
激活組件的拖拽事件。
def dragEnterEvent(self, e): if e.mimeData().hasFormat("text/plain"): e.accept() else: e.ignore()
首先,我們重構了dragEnterEvent()方法。設定好接受拖拽的數據類型(plain text)。
def dropEvent(self, e): self.setText(e.mimeData().text())
然后重構dropEvent()方法,更改按鈕接受鼠標的釋放事件的默認行為。
edit = QLineEdit("", self) edit.setDragEnabled(True)
QLineEdit默認支持拖拽操作,所以我們只要調用setDragEnabled()方法使用就行了。
程序展示:
這個例子展示怎么拖放一個button組件。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this program, we can press on a button with a left mouse click or drag and drop the button with the right mouse click. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import QPushButton, QWidget, QApplication from PyQt5.QtCore import Qt, QMimeData from PyQt5.QtGui import QDrag import sys class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) def mouseMoveEvent(self, e): if e.buttons() != Qt.RightButton: return mimeData = QMimeData() drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(e.pos() - self.rect().topLeft()) dropAction = drag.exec_(Qt.MoveAction) def mousePressEvent(self, e): super().mousePressEvent(e) if e.button() == Qt.LeftButton: print("press") class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setAcceptDrops(True) self.button = Button("Button", self) self.button.move(100, 65) self.setWindowTitle("Click or Move") self.setGeometry(300, 300, 280, 150) def dragEnterEvent(self, e): e.accept() def dropEvent(self, e): position = e.pos() self.button.move(position) e.setDropAction(Qt.MoveAction) e.accept() if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() ex.show() app.exec_()
上面的例子中,窗口上有一個QPushButton組件。左鍵點擊按鈕,控制臺就會輸出press。右鍵可以點擊然后拖動按鈕。
class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent)
從QPushButton繼承一個Button類,然后重構QPushButton的兩個方法:mouseMoveEvent()和mousePressEvent().mouseMoveEvent()是拖拽開始的事件。
if e.buttons() != Qt.RightButton: return
我們只劫持按鈕的右鍵事件,左鍵的操作還是默認行為。
mimeData = QMimeData() drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(e.pos() - self.rect().topLeft())
創建一個QDrag對象,用來傳輸MIME-based數據。
dropAction = drag.exec_(Qt.MoveAction)
拖放事件開始時,用到的處理函數式start().
def mousePressEvent(self, e): QPushButton.mousePressEvent(self, e) if e.button() == Qt.LeftButton: print("press")
左鍵點擊按鈕,會在控制臺輸出“press”。注意,我們在父級上也調用了mousePressEvent()方法,不然的話,我們是看不到按鈕按下的效果的。
position = e.pos() self.button.move(position)
在dropEvent()方法里,我們定義了按鈕按下后和釋放后的行為,獲得鼠標移動的位置,然后把按鈕放到這個地方。
e.setDropAction(Qt.MoveAction) e.accept()
指定放下的動作類型為moveAction。
程序展示:
這個就一個按鈕,沒啥可展示的,弄GIF太麻煩了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42973.html
摘要:歡迎加群與我一起學習創建一個對象,接收一個文件作為參數。三個窗口和兩個分割線的布局創建完成了,但是要注意,有些主題下,分割線的顯示效果不太好。本例包含了一個和一個。 控件2 本章我們繼續介紹PyQt5控件。這次的有QPixmap,QLineEdit,QSplitter,和QComboBox。 圖片 QPixmap是處理圖片的組件。本例中,我們使用QPixmap在窗口里顯示一張圖片。 #...
摘要:事件目標是事件想作用的目標。處理事件方面有個機制。這個例子中,我們替換了事件處理器函數。代表了事件對象。程序展示信號發送實例能發送事件信號。我們創建了一個叫的信號,這個信號會在鼠標按下的時候觸發,事件與綁定。 事件和信號 事件 signals and slots 被其他人翻譯成信號和槽機制,(⊙o⊙)…我這里還是不翻譯好了。 所有的應用都是事件驅動的。事件大部分都是由用戶的行為產生的,...
閱讀 882·2021-11-23 09:51
閱讀 1089·2021-11-15 17:57
閱讀 1667·2021-09-22 15:24
閱讀 812·2021-09-07 09:59
閱讀 2221·2019-08-29 15:10
閱讀 1849·2019-08-29 12:47
閱讀 751·2019-08-29 12:30
閱讀 3369·2019-08-26 13:51