是否可以将参数传递给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中的任何对象创建一个函数,但这次数字是动态的,我确信有一些更优雅的方法来创建这种信号连接,我到目前为止还没有理解我的文件阅读。
答案 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