这是PyQt6教程。本教程适合初学者和中级程序员。阅读本教程后,您将能够编写非平凡的PyQt6应用程序。

代码示例可在本站下载:教程源代码

目录

  • 引言
  • 日期和时间
  • 第一个工程
  • 菜单与工具栏
  • 布局管理
  • 事件和信号
  • 对话框
  • 控件
  • 拖放
  • 绘画

拖放

在PyQt6教程的这一部分中,我们将介绍拖放操作。
在计算机图形用户界面中,拖放是指点击虚拟对象并将其拖动到不同位置或另一个虚拟对象上的动作(或支持该动作)。一般来说,它可用于调用多种操作,或在两个抽象对象之间创建各种类型的关联。

拖放是图形用户界面的一部分。拖放操作使用户能够直观地完成复杂的事情。
通常,我们可以拖放两件事:数据或一些图形对象。如果我们将图像从一个应用程序拖动到另一个应用程式,我们就会拖放二进制数据。如果我们在Firefox中拖动一个选项卡并将其移动到另一个位置,我们就会拖放一个图形组件。

QDrag

QDrag支持基于MIME的拖放数据传输。它处理拖放操作的大部分细节。传输的数据包含在对象中。QMimeData. 

PyQt6中的简单拖放示例

PyQt6中的简单拖放示例
在第一个例子中,我们有a和a。我们从行编辑小部件中拖动纯文本,并将其放到按钮小部件上。按钮的标签将更改。. QLineEditQPushButton

#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This is a simple drag and
drop example.

Author: Jan Bodnar
Website: zetcode.com
"""

import sys

from PyQt6.QtWidgets import (QPushButton, QWidget,
        QLineEdit, QApplication)


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)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec()


if __name__ == '__main__':
    main()

该示例展示了一个简单的拖放操作。

class Button(QPushButton):

    def __init__(self, title, parent):
        super().__init__(title, parent)

        ...

为了在控件上放置文本,我们必须重新实现一些方法。因此,我们创建了自己的类,该类继承自该类。QPushButtonButtonQPushButton

self.setAcceptDrops(True)

我们使用为控件启用drop事件。setAcceptDrops

def dragEnterEvent(self, e):

    if e.mimeData().hasFormat('text/plain'):
        e.accept()
    else:
        e.ignore()

首先,我们重新实现该方法。我们告知我们接受的数据类型。在我们的例子中,它是纯文本。

dragEnterEvent

def dropEvent(self, e):

    self.setText(e.mimeData().text())

通过重新实现该方法,我们定义了drop事件中发生的事情。在这里,我们更改按钮控件的文本。

dropEvent

edit = QLineEdit('', self)
edit.setDragEnabled(True)

该控件内置了对拖动操作的支持。我们需要做的就是调用该方法来激活它。QLineEditsetDragEnabled

拖放按钮控件


以下示例演示了如何拖放按钮控件。

#!/usr/bin/python

"""
ZetCode PyQt6 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
"""

import sys

from PyQt6.QtCore import Qt, QMimeData
from PyQt6.QtGui import QDrag
from PyQt6.QtWidgets import QPushButton, QWidget, QApplication


class Button(QPushButton):

    def __init__(self, title, parent):
        super().__init__(title, parent)


    def mouseMoveEvent(self, e):

        if e.buttons() != Qt.MouseButtons.RightButton:
            return

        mimeData = QMimeData()

        drag = QDrag(self)
        drag.setMimeData(mimeData)

        drag.setHotSpot(e.position().toPoint() - self.rect().topLeft())

        dropAction = drag.exec(Qt.DropActions.MoveAction)


    def mousePressEvent(self, e):

        super().mousePressEvent(e)

        if e.button() == Qt.MouseButtons.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, 550, 450)


    def dragEnterEvent(self, e):

        e.accept()


    def dropEvent(self, e):

        position = e.position()
        self.button.move(position.toPoint())

        e.setDropAction(Qt.DropActions.MoveAction)
        e.accept()


def main():
    
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec()


if __name__ == '__main__':
    main()

在我们的代码示例中,我们在窗口上有一个。如果我们用鼠标左键点击按钮,“按下”消息将打印到控制台上。通过右键单击并移动按钮,我们可以在按钮控件上执行拖放操作。QPushButton

class Button(QPushButton):

    def __init__(self, title, parent):
        super().__init__(title, parent)

我们创建了一个派生自的类。我们还重新实现了的两种方法(:)和(.)。该方法是拖放操作开始的地方。

if e.buttons() != Qt.MouseButtons.RightButton:
    return

在这里,我们决定只能用鼠标右键执行拖放操作。鼠标左键保留用于单击按钮。

drag = QDrag(self)
drag.setMimeData(mimeData)

drag.setHotSpot(e.position().toPoint() - self.rect().topLeft())

对象已创建。该类支持基于MIME的拖放数据传输。QDrag

dropAction = drag.exec(Qt.DropActions.MoveAction)

拖动对象的方法启动拖放操作。

def mousePressEvent(self, e):

    super().mousePressEvent(e)

    if e.button() == Qt.MouseButtons.LeftButton:
        print('press')

如果我们用鼠标左键单击按钮,我们会在控制台上打印“按下”。请注意,我们也在父对象上调用方法。否则,我们不会看到按钮被按下。

position = e.pos()
self.button.move(position)

在该方法中,我们指定了释放鼠标按钮并完成拖放操作后会发生什么。在我们的例子中,我们找到当前的鼠标指针位置并相应地移动按钮。

e.setDropAction(Qt.MoveAction)
e.accept()

我们使用指定拖放操作的类型。在我们的情况下,这是一个行动。setDropAction
PyQt6教程的这一部分专门介绍拖放操作。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐