使用pyqt4写GUI小程序时一个clicked信号调用三次槽函数

classPlatWeightMdiSubWindow(QWidget,platWeight_ui.Ui_Form):def__init__(self,parent=No... class PlatWeightMdiSubWindow(QWidget, platWeight_ui.Ui_Form):
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来生成的,后来改成直接通过代码来写就没有问题,不知道为什么
zeicool
2018-08-08
知道答主
回答量:10
采纳率:0%
帮助的人:5.2万
展开全部
jingfang1998 回答的比较接近,下面我说一下最简单的方法:
就是槽函数不要用 on_按钮名_clicked 这种写法,就OK了,因为那样写会让按钮与设计器默认事件挂钩,所以会重复执行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jingfang1998
2018-04-03
知道答主
回答量:9
采纳率:0%
帮助的人:8828
展开全部

我也遇到了同样的问题, 不过在一番尝试和学习后终于知道怎么解决了

参考 (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)

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式