当前位置: 首页 > 面试题库 >

PyQt4-拖放

李兴安
2023-03-14
问题内容

嘿,我一直在阅读本教程,以了解PyQt4中的拖放方法。但是,我无法理解以下几点。如果某事能够使我更清楚,那将是很好的。

 def mouseMoveEvent(self, e): //class Button


    mimeData = QtCore.QMimeData()

    drag = QtGui.QDrag(self)
    drag.setMimeData(mimeData)
    drag.setHotSpot(e.pos() - self.rect().topLeft())

    dropAction = drag.start(QtCore.Qt.MoveAction)

def dropEvent(self, e): //class Example

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

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

为什么会有单独的self.button.move()和e.setDropAction()self.button.move()实际不移动按钮本身吗?有人可以解释一下drag.setHotSpot和drag.start()的作用吗?谢谢。


问题答案:

该教程已严重过时。QDrag.start从Qt 4.3开始已经过时了。QDrag.exec_应该改为使用。

从的文档中可以看到exec,它具有返回值。setDropActionindropEvent确定此值。它不执行移动。这就是为什么您需要进行self.button.move()实际移动的原因。那么,a的意义是setDropAction什么?您可能需要知道您执行了哪种拖动操作。假设您要在两个列表小部件之间实现拖放。如果执行了移动操作,则意味着您需要从源窗口小部件中删除该项目,然后在目标中创建一个项目。如果是复制操作,则可以保留原件,而只需在目标中创建一个副本。

setHotSpot/hotSpot是有关setPixmapQDragQPixmap拖动项目时可以显示一个。hotSpot确定像素图的位置。像素图的位置将使光标位于hotSpot相对于像素图的左上角。因此,在该教程的情况下,由于没有要显示的像素图,因此毫无意义。

这是该教程的一些修改和更新的版本。希望我已经包含了足够的评论。你可以 移动 使用Right-Click复制Shift + Right- Click

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class Button(QtGui.QPushButton):
    def mouseMoveEvent(self, e):
        if e.buttons() != QtCore.Qt.RightButton:
            return

        # write the relative cursor position to mime data
        mimeData = QtCore.QMimeData()
        # simple string with 'x,y'
        mimeData.setText('%d,%d' % (e.x(), e.y()))

        # let's make it fancy. we'll show a "ghost" of the button as we drag
        # grab the button to a pixmap
        pixmap = QtGui.QPixmap.grabWidget(self)

        # below makes the pixmap half transparent
        painter = QtGui.QPainter(pixmap)
        painter.setCompositionMode(painter.CompositionMode_DestinationIn)
        painter.fillRect(pixmap.rect(), QtGui.QColor(0, 0, 0, 127))
        painter.end()

        # make a QDrag
        drag = QtGui.QDrag(self)
        # put our MimeData
        drag.setMimeData(mimeData)
        # set its Pixmap
        drag.setPixmap(pixmap)
        # shift the Pixmap so that it coincides with the cursor position
        drag.setHotSpot(e.pos())

        # start the drag operation
        # exec_ will return the accepted action from dropEvent
        if drag.exec_(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
            print 'moved'
        else:
            print 'copied'


    def mousePressEvent(self, e):
        QtGui.QPushButton.mousePressEvent(self, e)
        if e.button() == QtCore.Qt.LeftButton:
            print 'press'



class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()


    def initUI(self):
        self.setAcceptDrops(True)

        button = Button('Button', self)
        button.move(100, 65)

        self.buttons = [button]

        self.setWindowTitle('Copy or Move')
        self.setGeometry(300, 300, 280, 150)


    def dragEnterEvent(self, e):
        e.accept()


    def dropEvent(self, e):
        # get the relative position from the mime data
        mime = e.mimeData().text()
        x, y = map(int, mime.split(','))

        if e.keyboardModifiers() & QtCore.Qt.ShiftModifier:
            # copy
            # so create a new button
            button = Button('Button', self)
            # move it to the position adjusted with the cursor position at drag
            button.move(e.pos()-QtCore.QPoint(x, y))
            # show it
            button.show()
            # store it
            self.buttons.append(button)
            # set the drop action as Copy
            e.setDropAction(QtCore.Qt.CopyAction)
        else:
            # move
            # so move the dragged button (i.e. event.source())
            e.source().move(e.pos()-QtCore.QPoint(x, y))
            # set the drop action as Move
            e.setDropAction(QtCore.Qt.MoveAction)
        # tell the QDrag we accepted it
        e.accept()



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_()


 类似资料:
  • 问题内容: 我一直在编码OCR书籍扫描程序(它通过读取页码来重命名页面),并且已经从基本的CLI Python脚本切换到GUI。 我正在使用PyQT4并拖放查看大量文档,但是没有运气。它只是拒绝接收那些文件!我将这些用于我的UI设计文章: http://tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/

  • 本文向大家介绍pyqt 安装PyQt4,包括了pyqt 安装PyQt4的使用技巧和注意事项,需要的朋友参考一下 示例 建议的安装方法 Windows:下载并运行二进制安装文件。 Linux(Debian):在命令行中运行以下命令: OS X:在命令行中运行以下命令: 手动安装 您也可以从此处手动下载源代码,然后自己安装和配置它。 测试您的安装 如果正确安装了pyqt,则可以运行该pyuic4命令。

  • 问题内容: 我安装了可正常运行的python 2.6,并且刚刚安装了为python 2.6构建的PyQt4(可从http://www.riverbankcomputing.co.uk/software/pyqt/download下载)。当我尝试导入PyQt4.QtGui时,出现以下错误: 我使用的是Windows 2k8 64位,但我的Python安装是32位。 问题答案: 将包含Qt应用程序和D

  • 问题内容: 有没有办法最小化PyQt4中的托盘?我已经使用过QSystemTrayIcon类,但是现在我想最小化或“隐藏”我的应用程序窗口,并仅显示任务栏图标。 有人这样做吗?任何方向将不胜感激。 在Window XP Pro上使用Python 2.5.4和PyQt4 问题答案: 一旦您记住没有办法真正最小化系统托盘,这将非常简单。 而是通过执行以下操作来伪造它: 在窗口上捕获最小化事件 在最小化

  • 问题内容: 对于这个问题,我很抱歉,但是我已经阅读了很多东西,而且看来我还不懂如何做一个计时器。所以我发布我的代码: 我正在尝试使该对象每200毫秒朝目标移动一次。我没有自我尝试过,它给了我同样的错误: 我不知道如何将计时器连接到带有参数的函数。我以为我没有正确使用SLOT参数,但这给了我这些错误。我想这都是错的。我将不胜感激:) 问题答案: 使用新样式的信号,它们更容易理解。 交换- 与- 一个

  • 问题内容: 在PyQt4网站上,他们安装软件包的说明是下载tarball并使用配置文件。我有两个版本的Python,一个是我的普通系统,另一个在anaconda内。我不确定如何在anaconda中安装它。是否有conda命令安装PyQt4? 问题答案: 费耶 PyQt现在可通过conda在所有平台上使用! 用得到这些#Python绑定Qt框架。@ 1:02 PM-2014年5月1日 https:/