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

PyQT4:将文件拖放到QListWidget中

湛鸿
2023-03-14
问题内容

我一直在编码OCR书籍扫描程序(它通过读取页码来重命名页面),并且已经从基本的CLI Python脚本切换到GUI。

我正在使用PyQT4并拖放查看大量文档,但是没有运气。它只是拒绝接收那些文件!我将这些用于我的UI设计文章:

  1. http://tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/

  2. http://zetcode.com/tutorials/pyqt4/dragdrop/

我注意到有很多设置PyQT4 GUI的方法。哪一个效果最好?

糟糕,这是项目的源代码。

主要脚本:

import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtGui import QListWidget
from layout import Ui_window

class StartQT4(QtGui.QMainWindow):
  def __init__(self, parent = None):
    QtGui.QWidget.__init__(self, parent)

    self.ui = Ui_window()
    self.ui.setupUi(self)

    QtCore.QObject.connect(self.ui.listWidget, QtCore.SIGNAL("dropped"), self.picture_dropped)

  def picture_dropped(self, l):
    for url in l:
     if os.path.exists(url):
      picture = Image.open(url)
      picture.thumbnail((72, 72), Image.ANTIALIAS)
      icon = QIcon(QPixmap.fromImage(ImageQt.ImageQt(picture)))
      item = QListWidgetItem(os.path.basename(url)[:20] + "...", self.pictureListWidget)
      item.setStatusTip(url)
      item.setIcon(icon)

class DragDropListWidget(QListWidget):
 def __init__(self, type, parent = None):
  super(DragDropListWidget, self).__init__(parent)
  self.setAcceptDrops(True)
  self.setIconSize(QSize(72, 72))

 def dragEnterEvent(self, event):
  if event.mimeData().hasUrls:
   event.accept()
  else:
   event.ignore()

 def dragMoveEvent(self, event):
  if event.mimeData().hasUrls:
   event.setDropAction(Qt.CopyAction)
   event.accept()
  else:
   event.ignore()

 def dropEvent(self, event):
  if event.mimeData().hasUrls:
   event.setDropAction(Qt.CopyAction)
   event.accept()
   l = []
   for url in event.mimeData().urls():
    l.append(str(url.toLocalFile()))
   self.emit(SIGNAL("dropped"), l)
  else:
   event.ignore()

if __name__ == "__main__":
  app = QtGui.QApplication(sys.argv)
  myapp = StartQT4()
  myapp.show()
  sys.exit(app.exec_())

和UI文件…

# Form implementation generated from reading ui file 'layout.ui'
#
# Created: Thu Nov 11 00:22:52 2010
#      by: PyQt4 UI code generator 4.8.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_window(object):
    def setupUi(self, window):
        window.setObjectName(_fromUtf8("window"))
        window.resize(543, 402)
        window.setAcceptDrops(True)
        self.centralwidget = QtGui.QWidget(window)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.listWidget = QtGui.QListWidget(self.centralwidget)
        self.listWidget.setProperty(_fromUtf8("cursor"), QtCore.Qt.SizeHorCursor)
        self.listWidget.setAcceptDrops(True)
        self.listWidget.setObjectName(_fromUtf8("listWidget"))
        self.verticalLayout.addWidget(self.listWidget)
        window.setCentralWidget(self.centralwidget)

        self.retranslateUi(window)
        QtCore.QMetaObject.connectSlotsByName(window)

    def retranslateUi(self, window):
        window.setWindowTitle(QtGui.QApplication.translate("window", "PyNamer OCR", None, QtGui.QApplication.UnicodeUTF8))

感谢任何可以提供帮助的人!


问题答案:

您作为示例使用的代码似乎运行良好,并且看起来很干净。根据您的评论,您的列表小部件尚未初始化。这应该是您问题的根本原因。我已经简化了您的代码,并在我的Ubuntu
10.04LTS上进行了尝试,并且运行良好。我的代码在下面列出,看看是否也适合您。您应该能够将文件拖放到列表小部件中;删除后,将添加一个新项目,其中显示了图像和图像的文件名。

import sys
import os
from PyQt4 import QtGui, QtCore

class TestListView(QtGui.QListWidget):
    def __init__(self, type, parent=None):
        super(TestListView, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QtCore.QSize(72, 72))

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(QtCore.SIGNAL("dropped"), links)
        else:
            event.ignore()

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.view = TestListView(self)
        self.connect(self.view, QtCore.SIGNAL("dropped"), self.pictureDropped)
        self.setCentralWidget(self.view)

    def pictureDropped(self, l):
        for url in l:
            if os.path.exists(url):
                print(url)                
                icon = QtGui.QIcon(url)
                pixmap = icon.pixmap(72, 72)                
                icon = QtGui.QIcon(pixmap)
                item = QtGui.QListWidgetItem(url, self.view)
                item.setIcon(icon)        
                item.setStatusTip(url)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

希望这会有所帮助,问候



 类似资料:
  • 问题内容: 嘿,我一直在阅读本教程,以了解PyQt4中的拖放方法。但是,我无法理解以下几点。如果某事能够使我更清楚,那将是很好的。 为什么会有单独的self.button.move()和e.setDropAction()self.button.move()实际不移动按钮本身吗?有人可以解释一下drag.setHotSpot和drag.start()的作用吗?谢谢。 问题答案: 该教程已严重过时。从

  • 问题内容: 如今,我们可以将文件拖放到一个特殊的容器中,并使用XHR2上载它们。带有实时进度条等。非常酷的东西。 但是有时候我们不想要那么酷。我想要的是一次将文件拖放 到标准HTML文件输入中 :。 那可能吗?有什么方法可以从文件拖放中用正确的文件名(?)“填充”文件输入吗?(出于文件系统安全性原因,完整的文件路径不可用。) 为什么? 因为我想提交一份普通表格。适用于所有浏览器和所有设备。拖放只是

  • 问题内容: 在同一对话框窗口中有两个QListWIdget。都启用了DragDrop功能。如果我将文件拖放到两个ListWidges中的任何一个,程序将识别出该文件并打印出被删除文件的列表。但是除了拖放文件之外,我还希望能够将List小部件Items从一个拖放到另一个。如果我拖动ListItems,则会触发拖放事件。但是它无法识别出哪些项已放置到窗口小部件上。示例代码如下。目的是将列表项从一个Li

  • 问题内容: 有人可以告诉我我在做什么错吗?我可以使用常规面板进行拖放操作,但现在尝试使用表格,无法对其进行整理。我对Points和DropTargets感到困惑。不要介意“添加”按钮。我觉得我需要首先处理DnD。 问题答案: 我个人会放弃滚动窗格上的放置目标,这将导致您遇到许多问题。 您的放置方法有点怪异… 这是一个坏主意.... 基本上,您尝试从可转移文件中提取文件列表,并且不管操作成功与否,您

  • 问题内容: 我正在尝试向我的SwiftUI Mac应用程序添加“拖放”手势/功能。 我想将文件从系统/桌面拖放到应用程序中。我发现它可以在常规Swift中使用。我现在正尝试在SwiftUI中执行此操作。 我在SwiftUI for Views中找到了一个函数。但是,看起来这仅适用于应用程序内部的内部手势。我想从外面拖文件。 在Swift中,您需要为拖动的类型注册NSView。 我想创建一个NSVi

  • 作为桌面程序,当然希望能够实现操作系统的 drag & drop 功能。 很多网站已经支持拖拽文件 Electron 当然也支持 要在 app 中实现此功能 ,你需要在 Render 进程中调用webContents.startDrag(item) API, 此API会给 Main 进程发送一个ondragstart事件。 在 Render 进程中, 接收 ondragstart 事件并发送消息到