将参数传递给PyQt SIGNAL连接

时间:2014-04-04 07:44:51

标签: python pyqt qmenu

是否可以将参数传递给PyQt4信号连接?在我的情况下,我有 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)  

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

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

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

示例

在执行时,用户的输入为3,因此我将使用相同的菜单进行3行编辑和3个按钮:

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

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

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

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

3 个答案:

答案 0 :(得分:2)

请注意,您在PyQt中使用了已弃用的SIGNAL / SLOT实现has been removed in PyQt5(甚至它在PyQt4中的当前实现也有些错误)。

如果可能,我会更改代码中的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)中处理信号/槽片的一般概念。 / p>

答案 1 :(得分: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())

答案 2 :(得分: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 sending parameter to slot when connecting to a signal