单击一次按钮会多次触发信号,而不是一次

时间:2015-08-09 13:21:48

标签: python pyside

我使用pyside和sqlalchemy作为联系信息数据库。

sqlalchemy的设置非常标准,除了我使用sessionmaker()创建会话时,我设置了expire_on_commit = False

为了能够在座位内创建新会话,我使用了一种刷新按钮。问题是每次我使用刷新按钮,当我尝试添加新的行/条目时,我得到2或4个额外的条目(只需点击一下),而如果一个被删除,则所有"副本和#34 ;也被删除(它们不是真正的副本,因为每个副本都有自己唯一的ID)。

def refresh(self):

    self.session.close_all()
    self.session = CreateSession(self.username, self.password) #custom method defined elsewhere for creating a session

    self.TableViews() #initializing the table views for pyside

    self.WidgetsToAttributes() #connect widgets of the gui to the sqlalchemy scheme attributes

    self.connectSignals() #connects the qt signals to the appropriate functions in code

    pass

(还有一些额外的初始化,但它们在这里无关紧要,因为它们只是初始化一些小部件)

所有上述功能都用于其他地方,例如用于GUI的首次初始化,因此这里不起作用的是方法的组合。从我收集的内容来看,导致所有麻烦的connectSignals()方法。信号显然加倍(有时翻了四倍),从而导致一次点击(执行代码)。

是什么导致这种情况,我该如何避免呢?

1 个答案:

答案 0 :(得分:0)

如果您多次拨打connect,您的信号将连接多次到同一个插槽。然后,一个信号将触发对插槽的多次调用。我想这就是你在数据库中获得多个条目的原因。

举个简单的例子,每次单击按钮时,下面的代码都会打印两个“1”:

self.button=QtGui.QPushButton("my button")
self.button.clicked.connect(self.on_click)
self.button.clicked.connect(self.on_click)
def on_click(self):
    print("1")

当对象被销毁时,信号会自动断开。在您的情况下,您销毁self.session以创建一个新的。因此,应该销毁与self.session直接相关的每个信号。

但如果你有这样的事情:

class myWidget(QtGui.QWidget):
    def __init__( self, parent=None):
        super(myWidget, self ).__init__( parent )
        self.button=QtGui.QPushButton("add entry")
        self.button.clicked.connect(self.on_click)

    def on_click(self):
        self.session.add_an_entry()

然后销毁self.session不会断开按钮和on_click功能之间的信号。
因此,您可以多次调用此类connect,也可以手动删除disconnect的连接。