PyQt - Kéo và thả
Việc cung cấp drag and droprất trực quan cho người dùng. Nó được tìm thấy trong nhiều ứng dụng máy tính để bàn, nơi người dùng có thể sao chép hoặc di chuyển các đối tượng từ cửa sổ này sang cửa sổ khác.
Truyền dữ liệu kéo và thả dựa trên MIME dựa trên lớp QDrag. QMimeDatacác đối tượng liên kết dữ liệu với kiểu MIME tương ứng của chúng. Nó được lưu trữ trên khay nhớ tạm và sau đó được sử dụng trong quá trình kéo và thả.
Các hàm lớp QMimeData sau đây cho phép kiểu MIME được phát hiện và sử dụng một cách thuận tiện.
Kiểm thử | Getter | Người định cư | Các loại MIME |
---|---|---|---|
hasText () | bản văn() | setText () | văn bản / đơn giản |
hasHtml () | html () | setHtml () | text / html |
hasUrls () | url () | setUrls () | text / uri-list |
có hình ảnh() | imageData () | setImageData () | hình ảnh / * |
hasColor () | colorData () | setColorData () | ứng dụng / x-màu |
Nhiều đối tượng QWidget hỗ trợ hoạt động kéo và thả. Những thứ cho phép kéo dữ liệu của họ có setDragEnabled () phải được đặt thành true. Mặt khác, các widget phải đáp ứng các sự kiện kéo và thả để lưu trữ dữ liệu được kéo vào chúng.
DragEnterEvent cung cấp một sự kiện được gửi đến tiện ích mục tiêu khi hành động kéo vào nó.
DragMoveEvent được sử dụng khi hành động kéo và thả đang diễn ra.
DragLeaveEvent được tạo khi hành động kéo và thả rời khỏi tiện ích con.
DropEvent, mặt khác, xảy ra khi việc thả được hoàn thành. Hành động được đề xuất của sự kiện có thể được chấp nhận hoặc từ chối có điều kiện.
Thí dụ
Trong đoạn mã sau, DragEnterEvent xác minh xem dữ liệu MIME của sự kiện có chứa văn bản hay không. Nếu có, hành động đề xuất của sự kiện được chấp nhận và văn bản được thêm vào dưới dạng một mục mới trong ComboBox.
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class combo(QComboBox):
def __init__(self, title, parent):
super(combo, self).__init__( parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
print e
if e.mimeData().hasText():
e.accept()
else:
e.ignore()
def dropEvent(self, e):
self.addItem(e.mimeData().text())
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
lo = QFormLayout()
lo.addRow(QLabel("Type some text in textbox and drag it into combo box"))
edit = QLineEdit()
edit.setDragEnabled(True)
com = combo("Button", self)
lo.addRow(edit,com)
self.setLayout(lo)
self.setWindowTitle('Simple drag & drop')
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()
if __name__ == '__main__':
main()
Đoạn mã trên tạo ra kết quả sau: