使用pyqt4写GUI小程序时一个clicked信号调用三次槽函数
def __init__(self,parent=None):
super(PlatWeightMdiSubWindow,self).__init__(parent)
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)
def on_saveButton_clicked(self):
print "OK"
def on_modifyButton_clicked(self):
print "AAAA"
def on_concelButton_clicked(self):
print "CONCEL"
程序代码如上,运行代码,单击modifyButton,控制台输出结果如下:
AAAA
AAAA
AAAA
从输出结果来看是槽函数on_modifyButton_clicked调用了三次,还望大侠指点 展开
推荐于2018-04-03
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来生成的,后来改成直接通过代码来写就没有问题,不知道为什么
就是槽函数不要用 on_按钮名_clicked 这种写法,就OK了,因为那样写会让按钮与设计器默认事件挂钩,所以会重复执行
我也遇到了同样的问题, 不过在一番尝试和学习后终于知道怎么解决了
方法一 :
首先, 你要是在自定义的函数上面加个装饰器@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)