当前位置: 代码迷 >> python >> PyQt:参数化连接功能
  详细解决方案

PyQt:参数化连接功能

热度:85   发布时间:2023-06-13 15:18:52.0

我有一组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()

您可以在图像类中包含已删除的函数及其信号,这样您就不必为每个类重复此函数,这是一个示例:

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

首先,您使用的是旧式信号和插槽,这些信号和插槽已过时,并且已在更新版本的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,那么当它们像这样使用时它们可以成为一个强大的工具,但要注意由于变量的而导致的潜在的意外行为。