2

是否可以将参数传递给 PyQt4 Signal 连接?在我的情况下,我有n 个按钮,它们设置了在界面上动态创建的相同菜单,具体取决于用户的输入:

for j in range(0, len(self.InputList)):

    arrow = QtGui.QPushButton(Form)
    arrow.setGeometry(QtCore.QRect(350, 40*(j+3)+15, 19, 23))

    menu = QtGui.QMenu(Form)
    for element in SomeList:
        cb = QtGui.QRadioButton(element,menu)
        ca = QtGui.QWidgetAction(menu)
        ca.setDefaultWidget(cb)
        QtCore.QObject.connect(cb,QtCore.SIGNAL("stateChanged(int)"),self.SomeFunction)
    arrow.setMenu(menu)  

尽管界面中所有按钮的菜单都是相同的,但用户应该能够从任何按钮中选择一个值,并且对于其中任何一个按钮,操作都是相同的(“将选定的值添加到行编辑") 唯一的区别是行编辑可能是第1行以及第2行和第 3行。

那么,我想问的是,是否有任何方法可以在这里传递参数j

QtCore.QObject.connect(cb,QtCore.SIGNAL("stateChanged(int)"),self.SomeFunction(j))

示例

在这个执行中,用户的输入是 3,所以我将有 3 行编辑和三个具有相同菜单的按钮:

Line Edit 1:
Line Edit 2:
Line Edit 3:

使用相同的功能SomeFunction,我想编辑 Line Edits 的值。因此,如果用户正在触摸附加到第二行编辑的菜单,SomeFunction则应使用参数 2 调用该函数SomeFunction(2),因此相同的方法将自行了解哪一行编辑是正确的:

Line Edit 1:
Line Edit 2: modified
Line Edit 3: 

我需要这个,因为主窗口上的行编辑数量取决于用户选择的内容。我是一个新手,到目前为止,我总是为 GUI 中的任何对象创建一个函数,但这次数字是动态的,我确信有一些更优雅的方法来创建这种信号连接,我虽然到目前为止我的文档阅读还没有理解。

4

3 回答 3

2

请注意,您在 PyQt 中使用已弃用的 SIGNAL/SLOT 实现版本,该版本已在 PyQt5 中删除(甚至它在 PyQt4 中的当前实现也有些错误)。

如果可能,我会更改代码中的 SIGNAL/SLOT 语法。

新的 Signal/Slot 机制的工作方式是这样的:

class Worker(QThread):
    stateChanged = Signal(int)

    ....

    def some_method(self):
        self.stateChanged.emit(1)

在 GUI 线程中,您也会有类似的东西(假设worker = Worker()在某处定义:

class GUI(QDialog)

    worker = Worker()

    def __init__(self, parent=None):
        super(GUI, self).__init__(parent)
        self.worker.stateChanged.connect(self.my_desired_method)

    def my_desired_method(self, param):
        print param #prints out '1'

当然,这段代码不能“开箱即用”,但它是关于如何在 PyQt(和 PySide)中处理信号/插槽的一般概念。

于 2014-04-04T09:18:27.090 回答
2

这是一种不同的方法:不是将数据作为参数附加到信号处理程序,而是将其附加到菜单项本身。这提供了更大的灵活性,因为数据没有隐藏在匿名函数中,因此可以被应用程序的任何部分访问。

它很容易实现,因为 Qt 已经提供了必要的 API。如果您采用这种方法,您的示例代码如下所示:

        for j in range(0, len(self.InputList)):

            arrow = QtGui.QPushButton(self)
            arrow.setGeometry(QtCore.QRect(350, 40*(j+3)+15, 19, 23))

            menu = QtGui.QMenu(self)
            group = QtGui.QActionGroup(menu)
            for element in SomeList:
                action = menu.addAction(element)
                action.setCheckable(True)
                action.setActionGroup(group)
                action.setData(j)
            arrow.setMenu(menu)

            group.triggered.connect(self.SomeFunction)

    def SomeFunction(self, action):
        print(action.data())
于 2014-04-04T09:24:21.213 回答
0

我认为这应该有所帮助。

self.op = "point"
QtCore.QObject.connect(self.radioButton, QtCore.SIGNAL("clicked(bool)"),lambda : self.anyButton(self.radioButton.isChecked(),self.op))

def anyButton(self,kol,vv):
    print kol
    print vv

输出是

>>> 
True
point

你可以看看这个:PyQt 在连接到信号时将参数发送到插槽

于 2014-04-04T08:25:00.780 回答