问题描述
我有一组3个列表小部件,都具有拖放功能。 我希望消除重复的代码,并寻求一些帮助。 正如您在我的Dialog类中看到的,我创建了3个Image类,它们是drag和drog列表。 截至目前,每个List Widget对应一个connect函数。
 self.connect(self.one, SIGNAL("dropped"), self.oneDropped) 
 
     在我看来,函数def oneDropped()可以变成一个函数,其中self.oneDropped是一个参数,但我在设置它时遇到了麻烦,可以使用一些帮助。 
     这是我的代码。 
我只使用Python几周,所以如果这是一个简单的问题,请道歉。
import sys
import os
from PyQt4 import uic
from PyQt4.QtGui import *
from PyQt4.QtCore import * 
class Image(QListWidget):
    def __init__(self, type, parent=None):
        super(Image, 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()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(SIGNAL("dropped"), links)
        else:
            event.ignore()
class Dialog(QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.ui = uic.loadUi('./qt/default.ui', self)
        self.one = Image(self)
        self.two = Image(self)
        self.three = Image(self)
        self.connect(self.one, SIGNAL("dropped"), self.oneDropped)
        self.connect(self.two, SIGNAL("dropped"), self.twoDropped)
        self.connect(self.three, SIGNAL("dropped"), self.threeDropped)
        self.baseimage_layout.addWidget(self.one)
        self.redimage_layout.addWidget(self.two)
        self.greenimage_layout.addWidget(self.three)
    def oneDropped(self, l):
        for url in l:
            if os.path.exists(url):
                print(url)
                icon = QIcon(url)
                pixmap = icon.pixmap(72, 72)
                icon = QIcon(pixmap)
                item = QListWidgetItem(url, self.one)
                item.setIcon(icon) 
    def twoDropped(self, l):
        for url in l:
            if os.path.exists(url):
                print(url)
                icon = QIcon(url)
                pixmap = icon.pixmap(72, 72)
                icon = QIcon(pixmap)
                item = QListWidgetItem(url, self.two)
                item.setIcon(icon) 
    def threeDropped(self, l):
        for url in l:
            if os.path.exists(url):
                print(url)
                icon = QIcon(url)
                pixmap = icon.pixmap(72, 72)
                icon = QIcon(pixmap)
                item = QListWidgetItem(url, self.three)
                item.setIcon(icon) 
def main():
    app = QApplication(sys.argv)
    form = Dialog()
    form.show()
    app.exec_()
if __name__=="__main__":
    main()
1楼
您可以在图像类中包含已删除的函数及其信号,这样您就不必为每个类重复此函数,这是一个示例:
import sys
import os
from PyQt4 import uic
from PyQt4.QtGui import *
from PyQt4.QtCore import * 
class Image(QListWidget):
    def __init__(self, type, parent=None):
        super(Image, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setIconSize(QSize(72, 72))
        self.connect(self, SIGNAL("dropped"), self.onDropped)
    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()
            links = []
            for url in event.mimeData().urls():
                links.append(str(url.toLocalFile()))
            self.emit(SIGNAL("dropped"), links)
        else:
            event.ignore()
    def onDropped(self, l):
        for url in l:
            if os.path.exists(url):
                print(url)
                icon = QIcon(url)
                pixmap = icon.pixmap(72, 72)
                icon = QIcon(pixmap)
                item = QListWidgetItem(url, self)
                item.setIcon(icon) 
class Dialog(QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.ui = uic.loadUi('./qt/default.ui', self)
        self.one = Image(self)
        self.two = Image(self)
        self.three = Image(self)
        self.baseimage_layout.addWidget(self.one)
        self.redimage_layout.addWidget(self.two)
        self.greenimage_layout.addWidget(self.three)
def main():
    app = QApplication(sys.argv)
    form = Dialog()
    form.show()
    app.exec_()
if __name__=="__main__":
    main()
2楼
首先,您使用的是旧式信号和插槽,这些信号和插槽已过时,并且已在更新版本的PyQt中删除。 如果可能,您应该使用 。
你的例子将成为:
self.one.dropped.connect(self.oneDropped)
要回答您的问题,在python中,您可以使用在调用插槽时添加其他参数。
 
     首先,您将定义一个将Image实例作为参数的通用处理程序。 
def imgDropped(self, l, img):
    for url in l:
        if os.path.exists(url):
            print(url)
            icon = QIcon(url)
            pixmap = icon.pixmap(72, 72)
            icon = QIcon(pixmap)
            item = QListWidgetItem(url, img)
            item.setIcon(icon) 
然后信号像这样连接
self.one.dropped.connect(lambda l: self.imgDropped(l, self.one))
self.two.dropped.connect(lambda l: self.imgDropped(l, self.two))
self.three.dropped.connect(lambda l: self.imgDropped(l, self.three))
如果你不熟悉lambda,那么当它们像这样使用时它们可以成为一个强大的工具,但要注意由于变量的而导致的潜在的意外行为。