2010-11-11 12 views
11

Bir OCR kitap taraması işlemi kodladım (sayfa numarasını okuyarak sayfaları yeniden adlandırır) ve temel CLI Python komut dosyasından bir GUI'ye geçtim.PyQT4: Dosyaları QListWidget içine sürükleyip bırakın

PyQT4 kullanıyorum ve sürükle ve bırak işleminde bir sürü belgeye baktım, ancak şans yok. Sadece bu dosyaları almayı reddediyor! Benim UI tasarımı için makalelere bu kullanıyordu:

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

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

Ben kurulum bir PyQt4 GUI için çeşitli yollar TON olduğunu fark ettim. Hangisi en iyi çalışır?

Hata! Burada proje için kaynak kodu.

ana komut:

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

Ve UI dosya yardımcı olabilir ... kimseye

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

teşekkürler!

+0

Emin olmak için ilgili, bunu içine dosyaları sürükleyerek konum ne zaman? –

+0

Her işlevin içinde bir print() ifadesi ekledim ve denetimi başlatmış gibi görünmüyor! * sobs * – Blender

cevap

16

Örnek olarak kullandığınız kod iyi çalışıyor ve oldukça temiz görünüyor. Yorumunuza göre liste widget'ınız başlatılmıyor; Bu, sorununun temel nedeni olmalıdır. Kodunuzu basitleştirdim, Ubuntu 10.04LTS cihazımda denedim ve iyi çalıştı. Kodum aşağıda listelenmiştir, sizin için de isteyip istemediğine bakın. Bir dosyayı liste widget'ına sürükleyip bırakabilmeniz gerekir; düştüğünde, görüntü ve resmin dosya adını gösteren yeni bir öğe eklenir. dropEvent içinde "event.mimeData(). hasUrls eğer" True sonucunu bu yardımcı olur

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

umut,

+0

Vay, bu kesinlikle yardımcı olacaktır. Programımı zaten çalıştırdım ve bu daha da iyi olacak! QListWidget sınıfını tamamen geçersiz kılmak mümkün olur mu? Bazı yeni işlevler eklemek istedim. Sorunuza – Blender

+2

cevabı, tam olarak neyi başarmaya çalıştığınıza bağlıdır. Muhtemelen QListView ve QAbstractModel torunlarından birini kullanmaya başlayabilirdim (veya kendi kitabımı yazdım). Oynamaya başlamak için bolca örnek var. –

+1

Tüm "event.mimeData(). HasUrls" ifadesini "event.mimeData()." Düzenleyin. HasUrls() '(en azından PyQt 4.8 için) –

İlgili konular