问题描述
我有一组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,那么当它们像这样使用时它们可以成为一个强大的工具,但要注意由于变量的而导致的潜在的意外行为。