python - PySide *任何*方法调用 - 信号和插槽

标签 python pyside qt-signals

我正在尝试为我的 PySide GUI 库创建简单、通用的方法调用:

class GUI(QApplication):
    def __init__(self, *args, **kwargs):
        super(GUI, self).__init__()
        self.gui_signal = Signal()
        self.gui_signal.connect(self.method_call)

获取对象、方法并使用args调用object.method的槽:

    @Slot()
    def method_call(self, obj, method_name, *args, **kwargs):
        method = getattr(obj, method_name)
        if method:
            return method(*args, **kwargs)
        else:
            return None

这应该发出那个棘手的插槽:

    def anymethod(self, obj, method_name, *args, **kwargs):
        self.gui_signal.emit(obj, method_name, *args, **kwargs)

这是另一个工作线程,例如更新进度条

class MyApp(object):
    ...

    def update_progress(self):
        perc = (self.done * 100) / self.total
        self.gui.anymethod(self.progressBar, 'setValue', int(perc))

我发现这种方法不起作用,并且参数传递的方式错误。我应该做什么来修复?

最佳答案

信号不应定义为类的成员,而应定义为类的属性。另一方面,您必须指明签名,最后,字典不支持,因此您必须将 *args**kwargs 转换为元组。

from PySide import QtCore, QtGui

class GUI(QtGui.QApplication):
    gui_signal = QtCore.Signal(object, str, tuple)

    def __init__(self, *args, **kwargs):
        super(GUI, self).__init__([])
        self.gui_signal.connect(self.method_call)

    @QtCore.Slot(object, str, tuple)
    def method_call(self, obj, method_name, data):
        if hasattr(obj, method_name):
            method = getattr(obj, method_name)
            args, kwargs = data
            if hasattr(method, '__call__'):
                method(*args, **kwargs)

    def anymethod(self, obj, method_name, *args, **kwargs):
        self.gui_signal.emit(obj, method_name, (args, kwargs))

class MyApp(object):
    def __init__(self):
        self.gui = GUI()

        self.progressBar = QtGui.QProgressBar(maximum=100)
        self.progressBar.show()

        self.total = 200
        self.done = 100
        QtCore.QTimer.singleShot(300, self.update_progress)

    def update_progress(self):
        perc = (self.done * 100) / self.total
        self.gui.anymethod(self.progressBar, 'setValue', int(perc))

    def run(self):
        return self.gui.exec_()

if __name__ == '__main__':
    import sys
    app = MyApp()
    sys.exit(app.run())

关于python - PySide *任何*方法调用 - 信号和插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53909767/

相关文章:

python - PySide (Qt) - 布局不起作用

c++ - 从计算机向计算机发送 XML 数据 - Qt

c++ - Qt自定义QPushButton点击信号

python - PySpark 从 s3 中的 zip 文件中读取两种不同文件类型的 csv

python - 根据多个 CSV 文件中找到的分类单元的频率创建一个表

macos - 在 Mac 上打开 QMenu 时,如何向其动态添加操作?

c++ - 使用 qvector 将 QTableWidget 项目从一个 qtableWidget 转移到另一个

c++ - 连接来自另一个在 Qt 中不起作用的类的插槽

python - 类型错误 : can't convert expression to float

python - 如何用 flask 扭曲运行?