pyqt:如何动态连接信号与用户提供的变量?

1 投票
1 回答
1968 浏览
提问于 2025-04-16 16:56

我创建了一个自定义类的对话框:

d = ModifyRect(ctrl_name, rect_name)

这个对话框是以非模态的方式显示的,也就是说用户可以在对话框打开的同时与其他窗口进行交互。当用户接受或拒绝这个对话框时,我想在我的主窗口上调用一个函数,并传入这两个变量,也就是说,我希望调用这个槽函数:

@QtCore.pyqtSlot("QString","QString")
def modifyRectAccepted(self, ctrl_name, rect_name):
    #foo

我该如何将 daccepted 事件连接到我的 MainWindowmodifyRectAccepted 函数,并传入这两个参数呢?或者说,至少连接这两个,但我希望能传入 ModifyRect 的实例,这样我就可以从中获取这些参数。

在 pygtk 中,这个操作非常简单——你可以在 connect 中传入更多的变量,它们会被转发,而且发出信号的控件总是会被传入。那么在 PyQt 中有什么类似的概念呢?

1 个回答

3

你不能直接这样做。你需要使用信号映射器或者中间槽。可以看看这个问题,几天前有人回答过。

或者,如果你只是想知道信号的来源,可以使用QObject的sender()方法。

编辑:要使用闭包作为中间槽,你必须使用新风格的信号和槽机制。这样做更符合Python的风格,并且可以让你指定任何可调用的对象。像这样:

d = ModifyRect()

l = lambda: modifyRectAccepted(ctrl_name, rect_name)
d.accepted.connect(l)

def modifyRectAccepted(self, ctrl_name, rect_name):
    #foo

撰写回答