He sido la codificación de un OCR libro de escaneo cosa (se cambia el nombre de las páginas por leer el número de la página), y ha cambiado a una interfaz gráfica de usuario de una base de mis CLI secuencia de comandos de Python.

Estoy usando PyQT4 y vimos un montón de documentos en arrastrar y soltar, pero no hubo suerte. Simplemente se niega a tomar esos archivos! Yo estaba usando estos artículos para mi diseño de interfaz de usuario:

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

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

Me di cuenta de que hay un montón de maneras de configurar una PyQT4 interfaz gráfica de usuario. Cual funciona mejor?

Uy, aquí está el código fuente del proyecto.

El script principal:

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_())

Y la interfaz de usuario de archivos…

# 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))

Gracias a cualquiera que pueda ayudar!

Sólo para estar seguro de que, «si el suceso.mimeData().hasUrls» en dropEvent evalúa a True cuando se está arrastrando archivos en ella?
He añadido un print() instrucción dentro de cada función, y no parecen incluso para inicializar el control! sollozos

OriginalEl autor Blender | 2010-11-11

1 Comentario

  1. 16

    El código que estás utilizando como ejemplo parecen funcionar bien y se ve muy limpio. De acuerdo con tu comentario tu widget de la lista no está recibiendo inicializado; esta debe ser la causa raíz de su problema. He simplificado el código un poco que la probé en mi Ubuntu 10.04 LTS y funcionó bien. Mi código se enumeran a continuación, ver si sería para usted también. Usted debe ser capaz de arrastrar y soltar un archivo en el widget de la lista; una vez que se cae se agrega un nuevo elemento que muestra la imagen y la imagen del nombre de archivo.

    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()

    espero que esto ayude, saludos

    Wow, esto sin duda le ayudará. Yo ya tengo mi programa en ejecución, y esto hará que sea aún mejor! Sería posible reemplazar la QListWidget de la clase en su totalidad? Quería añadir algunas nuevas funciones.
    respuesta a su pregunta depende de qué es exactamente lo que estamos tratando de lograr. Probablemente voy a empezar desde el uso de QListView y uno de QAbstractModel descendientes (o escribí mi propio uno). Hay un montón de ejemplos de todo para empezar a jugar con el.
    Usted debe editar todos los event.mimeData().hasUrls a event.mimeData().hasUrls() (al menos para PyQt 4.8)

    OriginalEl autor serge_gubenko

Dejar respuesta

Please enter your comment!
Please enter your name here