使用pyqt4写GUI小程序时一个clicked信号调用三次槽函数
发布网友
发布时间:2022-05-07 15:18
我来回答
共3个回答
热心网友
时间:2022-04-18 07:08
有时我们展示了一个列表, 并想提供查看某项列表的详细内容, 我们会在列表项的末端加一个查看按钮, 这时我们如何在按按钮的时候得知这是那一项呢? 这时就需要带参数的信号, 信号是可以带参数的, 参数会在信号发送时携带, 并传递给接收此信号的槽
from PyQt4 import QtGui, QtCore
class MyButton(QtGui.QPushButton):
myclicked = QtCore.pyqtSignal(int)
def __init__(self, _id, *args, **kwargs):
QtGui.QPushButton.__init__(self, *args, **kwargs)
self._id = _id
self.connect(self, QtCore.SIGNAL("clicked()"), self.emitMyclicked)
def emitMyclicked(self):
self.myclicked.emit(self._id)
app = QtGui.QApplication([])
w = QtGui.QWidget()
w.resize(100, 100)
def showMsg(_id):
QtGui.QMessageBox.information(w, u"信息", u"查看 %d" % _id)
btn = MyButton(1, u"查看1", w)
w.connect(btn, QtCore.SIGNAL("myclicked(int)"), showMsg)
btn2 = MyButton(2, u"查看2", w)
btn2.move(0, 30)
w.connect(btn2, QtCore.SIGNAL("myclicked(int)"), showMsg)
w.show()
app.exec_()
上面例子可以看出, QObject.emit 发送带参数的信号时要携带参数. 当然上面例子也可以用下面方式来写
from PyQt4 import QtGui, QtCore
class MyButton(QtGui.QPushButton):
def __init__(self, _id, *args, **kwargs):
self._id = _id
QtGui.QPushButton.__init__(self, *args, **kwargs)
self.connect(self, QtCore.SIGNAL("clicked()"), self.emitClicked)
def emitClicked(self):
self.emit(QtCore.SIGNAL("myclicked(int)"), self._id)
app = QtGui.QApplication([])
w = QtGui.QWidget()
w.resize(100, 100)
def showMsg(_id):
QtGui.QMessageBox.information(w, u"信息", u"查看 %d" % _id)
btn = MyButton(1, u"查看1", w)
w.connect(btn, QtCore.SIGNAL("myclicked(int)"), showMsg)
btn2 = MyButton(2, u"查看2", w)
btn2.move(0, 30)
w.connect(btn2, QtCore.SIGNAL("myclicked(int)"), showMsg)
w.show()
app.exec_()追问我的问题主要是发出一时clicked,但是槽函数响应了三次,我原来按钮是通过pyqt designer来生成的,后来改成直接通过代码来写就没有问题,不知道为什么
热心网友
时间:2022-04-18 08:26
jingfang1998 回答的比较接近,下面我说一下最简单的方法:
就是槽函数不要用 on_按钮名_clicked 这种写法,就OK了,因为那样写会让按钮与设计器默认事件挂钩,所以会重复执行
热心网友
时间:2022-04-18 10:01
我也遇到了同样的问题, 不过在一番尝试和学习后终于知道怎么解决了
参考 (2)PyQt4读取文件,但是对话框打开两次
方法一 :
首先, 你要是在自定义的函数上面加个装饰器@pyqtSignature(''), 然后执行, 会发现执行2次(少了一次)
其次, 你的platWeight_ui.Ui_Form父类应该是从Qt Designer生成的脚本(.py文件)里面import进来的吧, 去那个脚本里面, 把自定义的槽函数 (如果是默认生成的, 不需要改写的, 不要注掉)连接的 QtCore.QObject.connect(self.xxx, ......) 这句注掉, 不让他执行.
你展示出的代码的这个部分也注掉,不让其执行
self.setupUi(self)
# self.connect(self.modifyButton,SIGNAL("clicked()"),self.on_modifyButton_clicked)
# self.connect(self.concelButton,SIGNAL("clicked()"),self.on_concelButton_clicked)
# self.connect(self.saveButton,SIGNAL("clicked()"),self.on_saveButton_clicked)
最后, 你再试试, 应该就是执行一次了. 缺点是在pyUIC后, 如果自定义的地方多, 需要注释的地方太多了, 而且每次刷新后都要重新注掉
后来我发现了
方法二:
在Qt Designer生成的ui文件pyUIC后的脚本(.py文件)中, 把下面这句注掉就可以了, 这种改法最简单, 连装饰器都不用加了, 但是你那个connect貌似应该要注掉
# QtCore.QMetaObject.connectSlotsByName(MainWindow)